3

モニターのスクリーンショットを撮り、オプションでスナップショットにマウスカーソルを含める手順があります。本来の機能はモニター1台のみ。マウス カーソルを描画すると、現在、メイン モニターでのみ正しく表示されます。しかし、それを他のモニターに配置する方法がわかりません。この手順の最後にあるコメントを参照してください。

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;

使用しているモニターに応じて、マウスの位置を適切に切り替えるにはどうすればよいですか?

4

1 に答える 1

3

画面座標MonitorRect.Leftをビットマップ座標にマッピングしています0。同様に、MonitorRect.Top0。したがって、カーソルの画面位置が である場合、それをおよびCursorPosにマップします。次に、ホット スポットも考慮する必要がありますが、その方法はすでにわかっているようです。CursorPos.X - MonitorRect.LeftCursorPos.Y - MonitorRect.Top

上記のマッピングは、すべてのモニターに等しく適用されます。

1文字の変数が誤解を招くことがわかったため、独自の表記法を使用したことに注意してください。これらの変数の意味が関数中に変化するという事実は言うまでもありません。私はあなたを見ていますR。それは常に痛みのレシピです。

また、 を呼び出したときに渡されるビットマップ ハンドルを削除する必要はありませんGetIconInfoか? そして、いくつかのエラーチェックは失敗しません。

于 2013-06-02T20:25:23.337 に答える