2013-06-02 44 views
3

我有一個程序,它需要一個監視器的屏幕截圖,並且可以在快照中包含鼠標光標。原始功能僅適用於一臺顯示器。當繪製鼠標光標時,它目前僅在主監視器上正確顯示。但是,我無法弄清楚如何將它放置在任何其他顯示器上。請參閱此過程結束時的註釋。多監視器屏幕截圖 - 定位鼠標光標

procedure ScreenShot(var Bitmap: TBitmap; const MonitorNum: Integer; 
    const DrawCursor: Boolean; const Quality: TPixelFormat); 
var 
    DC: HDC; 
    C: TCanvas; 
    R: TRect; 
    CursorInfo: TCursorInfo; 
    Icon: TIcon; 
    IconInfo: TIconInfo; 
    M: TMonitor; 
    CP: TPoint; 
begin 
    M:= Screen.Monitors[MonitorNum]; 
    DC:= GetDC(GetDesktopWindow); 
    try 
    C:= TCanvas.Create; 
    try 
     C.Handle:= DC; 
     R:= M.BoundsRect; 
     Bitmap.Width:= R.Width; 
     Bitmap.Height:= R.Height; 
     Bitmap.PixelFormat:= Quality; 
     Bitmap.Canvas.CopyRect(Rect(0,0,R.Width,R.Height), C, R); 
    finally 
     C.Free; 
    end; 
    finally 
    ReleaseDC(GetDesktopWindow, DC); 
    end; 
    if DrawCursor then begin 
    R:= Bitmap.Canvas.ClipRect; 
    Icon:= TIcon.Create; 
    try 
     CursorInfo.cbSize:= SizeOf(CursorInfo); 
     if GetCursorInfo(CursorInfo) then 
     if CursorInfo.Flags = CURSOR_SHOWING then 
     begin 
     Icon.Handle:= CopyIcon(CursorInfo.hCursor); 
     if GetIconInfo(Icon.Handle, IconInfo) then 
     begin 
      CP:= CursorInfo.ptScreenPos; 

      //Transition mouse position...? 
      CP.X:= CP.X + M.Left; 
      CP.Y:= CP.Y + M.Top; //No difference? 

      Bitmap.Canvas.Draw(
      CP.X - Integer(IconInfo.xHotspot) - R.Left, 
      CP.Y - Integer(IconInfo.yHotspot) - R.Top, 
      Icon); 
     end; 
     end; 
    finally 
     Icon.Free; 
    end; 
    end; 
end; 

如何根據我使用的顯示器正確地轉換鼠標位置?

回答

3

您正在將屏幕座標MonitorRect.Left映射到位圖座標0。同樣,MonitorRect.Top0。所以,如果光標的屏幕位置是CursorPos那麼您將其映射到CursorPos.X - MonitorRect.LeftCursorPos.Y - MonitorRect.Top。然後你也需要考慮熱點,但你似乎已經知道如何做到這一點。

上面的映射同樣適用於所有監視器。

請注意,我使用自己的符號,因爲我發現你的單個字母變量錯誤的領先。更不要說這些變量的含義在函數中發生變化的事實。我看着你,R。這總是一個痛苦的祕訣。

此外,當您撥打GetIconInfo時,是否需要刪除交給您的位圖手柄?而一些錯誤檢查不會失誤。

+0

呃拍得好,這個'+'本來是一個''''它做到了。如果你刪除了這兩行,它就不起作用 - 它只會讓光標顯示在光標位於主顯示器上,但不顯示截屏的實際顯示器。 –

+0

哦,我明白了,你用了兩次R! R的值是位圖rect,它總是固定在0,0。 –

+0

這是值得回收的,因爲'如果DrawCursor然後開始'標誌着一個不同的代碼塊的開始。因此,我留下了一個簡短的名字,比如'R'。 –