【发布时间】:2019-12-04 16:02:42
【问题描述】:
我正在尝试将鼠标右键单击发送到指定坐标的窗口。
我用 2 个代码测试过
代码 1:
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll")]
static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint);
public struct POINT
{
public int x;
public int y;
}
var client = Process.GetProcessesByName("client_dx");
var whandle = client.MainWindowHandle;
POINT point = new POINT();
point.x = 1836;
point.y = 325;
ScreenToClient(whandle, ref point);
int lparm = (point.x << 16) + point.y;
int lngResult = SendMessage(whandle, 0x0204, 0, lparm);
int lngResult2 = SendMessage(whandle, 0x0205, 0, lparm);
代码 2:
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll")]
static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint);
public struct POINT
{
public int x;
public int y;
}
public int MakeLParam(int LoWord, int HiWord)
{
return (int)((HiWord << 16) | (LoWord & 0xFFFF));
}
var client = Process.GetProcessesByName("client_dx");
var whandle = client.MainWindowHandle;
POINT point = new POINT();
point.x = 1836;
point.y = 325;
ScreenToClient(whandle, ref point);
int lparm = MakeLParam(point.x, point.y);
int lngResult = SendMessage(whandle, 0x0204, 0, lparm);
int lngResult2 = SendMessage(whandle, 0x0205, 0, lparm);
它发送了一个右键单击但没有发送到正确的坐标,似乎它忽略了我在 LPARAM 中指定的坐标,因为如果我在窗口周围移动鼠标,它会在我放置鼠标指针但不在坐标中的任何地方点击我指定。
我已经测试过在代码 2 中更改这一行:
int lparm = MakeLParam(point.x, point.y);
到这个:
int lparm = (point.x << 16) + point.y;
但是不起作用,我得到了相同的结果...
【问题讨论】:
-
您是否测试/检查了 ScreenToClient() 返回(通过 ref)到点结构的坐标?
-
正如@VillageTech 所避免的那样,所使用的坐标是相对于您正在处理的客户端窗口,而不是整个桌面。在 WM_RBUTTONDOWN(/UP) 的文档中,它说“坐标相对于客户区的左上角。”
-
如您所见,我正在将桌面坐标“转换”为客户端坐标。 ScreenToClient(whandle, ref point);但无论如何,如果是这种情况,它并不能解释为什么当我移动鼠标时右键单击区域会发生变化,它忽略了我的坐标
-
VillageTech 指的是您永远不会检查
ScreenToClient返回的布尔值,以查看调用是成功还是失败。 -
使用
mouse_event
标签: c# .net winforms sendmessage right-click