c# - PostMessage 和 SendMessage WM_SETCURSOR、WM_LBBUTTONDOWN/UP 等都发送 xPox0、yPos0

标签 c# objective-c winapi postmessage

我正在编写一个 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)?

谢谢!

最佳答案

我想我终于可以看出您的代码有什么问题了。

[DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)] 
static extern bool PostMessage(IntPtr hwnd, uint Msg, long wParam, long lParam);

问题是 long 在 C# 中是 64 位宽。在 32 位进程中,这是不正确的,因为这些参数应该是 32 位宽。我希望您在通过调试器运行时看到堆栈不平衡警告。

正确的声明是:

static extern bool PostMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam);

您绝对不需要切换到 native C++ 代码来让它工作。

关于c# - PostMessage 和 SendMessage WM_SETCURSOR、WM_LBBUTTONDOWN/UP 等都发送 xPox0、yPos0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6603619/

相关文章:

c++ - 如何在 C++ 中获取 Windows 资源管理器的完整路径

java - 在 jython 中使用 mapi 发送邮件

c# - 使用更指定的返回类型(协方差)覆盖抽象属性

c# - 加入操作不起作用 mongo c# 驱动程序 linq

c# - 使用 HttpWebRequest 从 C# 连接到 Tagpacker.com

ios - UITableView - 使用 Hpple 数据设置表格 View

c - 为什么 WaitForSingleObject 会错过一个信号?

c# - 从 GUID 到完整路径

objective-c - 解决 id 类型的 "No known instance method for selector"错误

ios - 当我实现 heightForRowAtIndexPath 时,UITableView 单元格相互重叠