首页 > 解决方案 > C#获取鼠标相对于另一个进程窗口的位置

问题描述

我有 2 个窗口,可以是不同的大小/不同的位置。最终的目标是能够在某个位置点击窗口A ,并在同一点相对发送点击窗口B。

这是一个屏幕来解释我想要实现的目标:

在此处输入图像描述

现在我正在慢慢检索:

  1. 窗口 A把手/矩形
  2. 窗口 B把手/矩形
  3. 光标在屏幕上的位置

我听说过 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

标签: c#

解决方案


一旦你有了 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来了解在第二个窗口中单击的位置。


推荐阅读