WinApi SendMessage/PostMessage不能在我的计算机上工作
本文关键字:我的 计算机 工作 不能 SendMessage PostMessage WinApi | 更新日期: 2023-09-27 17:50:44
我用c#写了一些测试代码(使用WPF Form)来检查sendMessage/PostMessage是否会工作。这是:
Process x = Process.GetProcessesByName("Any Apps")[0];
if (x == null) return;
MessageBox.Show(x.Id.ToString()); // always works
NativeMethods.SendMessage(x.MainWindowHandle, 0x100, 0x70, 0);//F1
NativeMethods.SendMessage(x.MainWindowHandle, 0x101, 0x70, 0);
在任何地方寻找过程工作,但是sendingMessage/postingMessage从来没有工作过,当我通过VS调试键运行应用程序。当我从桌面启动程序时,有时它能工作,有时不能。但是…有趣的是:在任何可用的机器上(安装XP的虚拟机,安装64位Windows 7的另一台电脑,安装32位Windows 7的朋友电脑),运行速度都很快。
有人有同样的问题吗?也许有人知道解决方法?提前感谢。
SendMessage
和PostMessage
工作得很好-但是在Windows中发送按键并不像你想象的那么简单。仅发送WM_KEYDOWN
和WM_KEYUP
消息是不可靠的发送输入。正在发送消息,但是要发送消息的窗口正在忽略它们。
- 键盘状态管理不正确:你不能用PostMessage 模拟键盘输入
- Windows应用程序有许多不同的窗口,主窗口可能不是处理键盘输入。在Windows中,击键会指向被聚焦的窗口——可能不是主窗口——想想Word主窗口和子文档窗口吧。
- 像
F1
这样的命令通常被实现为发送WM_COMMAND
消息的键盘加速器-我不相信假WM_KEYDOWN
&WM_KEYUP
消息将触发它们。
对,这段代码通常不能工作。它开始与WM_KEYDOWN/UP被张贴,而不是发送。但更严重的是,mainwindowwhandle属性通常不是用于接收键盘输入的窗口的句柄。它通常是一个框架窗口,显示菜单和工具栏之类的东西。接收输入的窗口通常是框架窗口的子窗口。就像一个文本框控件。记事本就是这样构建的应用程序的一个例子。
使用spy++工具来了解特定应用程序的窗口层次结构。
否则,使此代码泛型的唯一希望是将主窗口带到前台(pinvoke SetForegroundWindow)并模拟键盘敲击(pinvoke SendInput)。