如何将鼠标点击 X、Y 与特定窗口句柄对齐?

Posted

技术标签:

【中文标题】如何将鼠标点击 X、Y 与特定窗口句柄对齐?【英文标题】:How align mouse clicks X, Y with a specific window handle? 【发布时间】:2021-07-26 00:50:54 【问题描述】:

参考我的previous question,现在我有了这个公式:

X := Round((X * ResolutionX) / Image1.Width); 
Y := Round((Y * ResolutionY) / Image1.Height); // where ResolutionX and ResolutionY is Client screen resolution.

将鼠标点击坐标发送到远程屏幕;准确且工作正常,除非我希望将点击发送到某个窗口的特定句柄,否则点击不会发生在确切的位置,例如:

var
  Title: array [0 .. 255] of Char;
begin
  GetWindowText(GetForegroundWindow, Title, 255);
  if Title <> '' then
  begin
    if ContainsStr(string(Title), '- Google Chrome') then
    begin
      WindowHandle := FindWindow(nil, PChar(string(Title))); // works fine to this handle.
      WindowHandle := FindWindowEx(WindowHandle, 0, 'Chrome_RenderWidgetHostHWND', nil); // not works with this, click have a distance of exaclty local.
    end;
  end;
end;

接收鼠标点击:

PostMessage(WindowHandle, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(PosX, PosY));
PostMessage(WindowHandle, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(PosX, PosY));

有解决办法吗?

【问题讨论】:

【参考方案1】:

在 WM_LBUTTONDOWN 和 WM_LBUTTONUP 中,坐标是相对于窗口客户区的。您必须通过窗口的位置和窗口边框的偏移量来偏移 X/Y 位置。

注意窗口可以是子窗口,所以必须计算父子关系链的偏移量。

Windows API 有一个功能可以做到这一点:MapWindowPoints。

【讨论】:

看看使用ScreenToClient()MapWindowPoints() 来解决这个问题。 @RemyLebeau 对于 MapWindowPoints 可以,但对于 ScreenToClient 可能不行,因为前者是 Windows API,而后者是 Delphi 对象方法,当您手头有相应的类引用时工作。 OP 必须对任何应用程序的任何窗口执行操作。 @fpiette 我指的是 Win32 ScreenToClient() 函数,而不是 TControl.ScreenToClient() 类方法。 @RemyLebeau,我解决了ClientToScreen() - ClientToScreen(WindowHandle, Pt); PosX := PosX - Pt.X; PosY := PosY - Pt.Y;

以上是关于如何将鼠标点击 X、Y 与特定窗口句柄对齐?的主要内容,如果未能解决你的问题,请参考以下文章

将鼠标点击发送到另一个应用程序的 X Y 坐标

易语言,怎么对指定窗口模拟鼠标点击和按键,可以后台的

SendMessage, postmessage模拟鼠标左键

QT如何获取窗口外的鼠标点击事件,或者鼠标坐标

易语言监控鼠标按键

三维坐标系下,python如何获取鼠标点击事件,返回三维坐标x,y,z?