我在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);
在任何地方查找流程工作,但是当我使用VS调试密钥运行应用程序时,sendingMessage / postingMessage从未起作用。有时我从桌面启动程序时有效,有时则不行。但是......有趣的是:在任何可用的机器上(带有XP的VM,另一台带有64位Windows 7的计算机,带有32位Windows 7的朋友计算机)可以快速而精细地工作。
有人有同样的问题吗? Maby有人知道解决方案吗? 提前致谢。
答案 0 :(得分:5)
SendMessage
和PostMessage
工作正常 - 但在Windows中发送击键并不像您想象的那么简单。发送WM_KEYDOWN
和WM_KEYUP
消息只是发送输入的可靠信息。邮件正在发送,但您发送给它们的窗口忽略了它们。
F1
这样的命令通常被实现为keyboard accelerators,可以发送WM_COMMAND
条消息 - 我不会假冒WM_KEYDOWN
& WM_KEYUP
条消息会触发它们。答案 1 :(得分:2)
是的,这段代码通常不会起作用。它首先发布WM_KEYDOWN / UP,而不是发送。但更严重的是,MainWindowHandle属性通常不是用于接收键盘输入的窗口的句柄。它通常是框架窗口,显示菜单和工具栏等内容。接收输入的窗口通常是框架窗口的子窗口。像TextBox控件一样。记事本是以这种方式构建的应用程序的示例。
使用Spy ++工具深入了解特定应用程序的窗口层次结构。
否则,使这个代码变得通用的唯一希望是将主窗口置于前台(pinvoke SetForegroundWindow)并模拟键盘笔划(pinvoke SendInput)。