c# - C#获取鼠标相对于另一个进程窗口的位置
问题描述
我有 2 个窗口,可以是不同的大小/不同的位置。最终的目标是能够在某个位置点击窗口A ,并在同一点相对发送点击窗口B。
这是一个屏幕来解释我想要实现的目标:
现在我正在慢慢检索:
- 窗口 A把手/矩形
- 窗口 B把手/矩形
- 光标在屏幕上的位置
我听说过 ScreenToClient/ClientToScreen 并且我知道我需要在单击Window A时找到相对的鼠标位置,并将相对的点击发送到Window B
另外,要发送我的按钮点击我使用:
SendMessage(character.MainWindowHandle, 0x201, IntPtr.Zero, CreateParams(?,?);
SendMessage(character.MainWindowHandle, 0x202, IntPtr.Zero, CreateParams(?,?);
我需要找到两个问号
我现在的代码:
var windowAHandle = Win32Api.GetForegroundWindow();
var windowARect = Win32Api.GetWindowRectangle(windowAHandle);
var windowB = PersosEnLigne.First(w => w.Nom == "Character 2");
var windowBRect = Win32Api.GetWindowRectangle(windowB.Process.MainWindowHandle);
var ptTopLeft = new Win32Api.POINT();
var ptBottomRight = new Win32Api.POINT();
ptTopLeft.x = windowARect.Left;
ptTopLeft.y = windowARect.Top;
ptBottomRight.x = windowARect.Right;
ptBottomRight.y = windowARect.Bottom;
Win32Api.ScreenToClient(windowB.MainWindowHandle, ref ptTopLeft);
Win32Api.ScreenToClient(windowB.MainWindowHandle, ref ptBottomRight);
//I'm not even sure if I need to use ScreenToClient or ClientToScreen
解决方案
一旦你有了 WindowA 矩形,找到当前光标位置相对于 WindowA 矩形左上角的偏移位置:
Point offsetA = new Point(Cursor.Position.X - windowARect.Left, Cursor.Position.Y - windowARect.Top);
现在计算此偏移相对于 WindowA 的大小(宽度/高度)的“百分比”:
double xPct = (double)offsetA.X / (double)(windowARect.Right - windowARect.Left + 1);
double yPct = (double)offsetA.Y / (double)(windowARect.Bottom - windowARect.Top + 1));
现在,您可以通过找到 WindowB 的宽度/高度,乘以“百分比”,然后将该数字添加到 WindowB 的左上角来找到 WindowB 中的“相同”点:
int xOffsetB = (int)((double)(windowBRect.Right - windowBRect.Left + 1) * xPct);
int yOffsetB = (int)((double)(windowBRect.Bottom - windowBRect.Top + 1) * yPct);
Point offsetB = new Point(windowBRect.Left + xOffsetB, windowBRect.Top + yOffsetB);
现在您可以使用 X、Y 值offsetB
来了解在第二个窗口中单击的位置。
推荐阅读
- c++ - 多客户端 websocket 应用程序问题
- webpack - 带有部分的 webpack5 html 模板不适用于“npm run dev”
- firebase - 如何从我的存储库中获取数据,我无法获取我存储的数据
- python - 为什么这些位反转实现以如此不同的速度运行?
- asp.net-core - 如何在 .net6 中使用 WebApplicationFactory(没有可说的入口点)
- java - JavaFX Robot.getScreenCapture 导致场景之前没有更新
- unity3d - 如何在 Unity 中恢复丢失的场景
- python - 查找凸多边形外部垂直于其边缘的点
- c# - 如何在连接上使用代理?
- google-bigquery - 我可以有效地对 BigQuery 中的日期分区表进行 GROUP BY