为什么我的假按钮按下失败与发送消息.

本文关键字:消息 失败 我的 按钮 为什么 | 更新日期: 2023-09-27 18:00:17

我正在尝试通过SendMessage(..)方法将鼠标事件发送到窗口中的窗口。

我面临的问题是消息似乎没有传递到我要发送到的窗口,即使SendMessage返回0,这(根据文档(意味着消息已成功传递。

我正在使用以下代码段:

(让p成为Point结构,并selectedWindow.Handle窗口的有效句柄(

int position = ((p.X & 0xFFFF) << 16) | (p.Y & 0xFFFF);
SendMessage(selectedWindow.Handle, 0x0201, new IntPtr(), new IntPtr(position));
SendMessage(selectedWindow.Handle, 0x0202, new IntPtr(), new IntPtr(position));

0x02010x0202WM_LBUTTONDOWNWM_LBUTTONUP.

有人可以启发我为什么这不起作用吗?

(编辑:我正在使用ScreenToClient()方法将屏幕位置转换为窗口中的位置(

为什么我的假按钮按下失败与发送消息.

鼠标消息通常从消息队列中检索,这意味着您应该使用 PostMessage((。 但这不太可能是真正的问题,很少有程序在消息循环中进行鼠标处理。 UAC 是一个明显的失败方案,您无法将消息发送到提升的程序拥有的窗口。 您发送了错误的 WParam 值,这可能会产生影响。 当然,您可能有错误的窗口句柄。

但更可能的原因是我们看不到的代码。 您似乎遇到了一些麻烦来生成消息的 X 和 Y 坐标。 不需要这样的努力,单击按钮的位置并不重要。 您不妨单击(1,1(:

 PostMessage(selectedWindow.Handle, 0x0201, new IntPtr(1), new IntPtr(0x10001));
 PostMessage(selectedWindow.Handle, 0x0202, new IntPtr(0), new IntPtr(0x10001));

或者换句话说,鼠标坐标相对于窗口的左上角。 其他黑客正在生成BM_CLICK消息以及按钮生成的任何WM_COMMAND消息。

使用 Spy++ 工具观察消息处理。

我有三个建议:

首先,确保坐标相对于窗口工作区的原点。 如果使用屏幕坐标,则必须首先使用 ScreenToClient 函数进行转换。

其次,尝试使用PostMessage而不是SendMessage。 这更接近于模拟Windows的实际行为。

最后,除非您绝对反对移动实际的鼠标指针,否则您可能会发现使用 mouse_event 或 SendInput 函数更容易。