【发布时间】:2011-09-30 00:34:25
【问题描述】:
我正在编写一个 C# 程序来将点击从一个窗口发送到另一个窗口。我正在使用 winapi 中的 SendMessage 和 PostMessage。 SendMessage 适用于键盘事件,但是当我尝试使用它发送鼠标事件时,它总是发送鼠标坐标 0,0。我可以使用 spy++ 验证应用程序正在接收事件,但 x 和 y 位于 (0,0) 并且应用程序认为鼠标在屏幕外 NCHITTEST=NOTCLIENT。
代码如下:
PostMessage(appWin, (int)WMessages.WM_MOUSEMOVE, 0, MakeDword(300, 200));
PostMessage 声明为:
[DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)]
protected static extern bool PostMessage(IntPtr hwnd, uint Msg, long wParam, long lParam);
其中 appWin 是窗口的句柄(用 spy++ 验证它接收事件)。 该窗口根本没有控件。 我还尝试了多个宏 MakeLParam、MakeDword、手工完成等。 我正在使用Windows7。
我昨晚/今天早上的大部分时间都在试图找出问题所在,但我一直没能找到。虽然网上有很多关于 Post/SendMessage 的帖子,但我只能找到一个出现类似问题并且没有答案的帖子。
总结问题: 有谁知道为什么 SendMessage 会向应用程序窗口发送正确的消息,而不是将 x 和 y 坐标传递给它,因为它总是传递 (0,0)?
谢谢!
【问题讨论】:
-
伪造输入并不容易。有时你可以让它与 SendMessage/PostMessage 一起工作,但通常会失败。你要做的就是打电话给
SendInput(),或者更容易使用的mouse_event()。 -
感谢您的回答,但是 SendInput() 和 mouse_event() 都通过将事件注入设备队列来控制真正的鼠标。我需要真正的鼠标不受影响。您还有其他想法吗?
-
不,我没有更多的想法。您是否准备好应对您所尝试的方法不起作用的可能性?
-
如果你说我是否考虑过不可能做到的可能性,那么答案是否定的。如果您的意思是我是否想过我可能没有正确的技能来解决这个问题,那么我不得不说我仍然乐观地看到注入键盘输入正在起作用,我认为这里的问题是对于有经验的人来说很容易发现/解决。我希望这里有这样的人能善待我。
-
我认为没有
SendInput就不可能。目标应用是什么?你想用伪造的输入做什么?也许还有另一种方法可以实现您的目标。我不认为您的最终目标是伪造输入。你可能有一个更平淡无奇的目标!
标签: c# objective-c winapi postmessage