如何将鼠标点击 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 与特定窗口句柄对齐?的主要内容,如果未能解决你的问题,请参考以下文章