WinApi SendMessage / PostMessage在我的电脑上不起作用?

时间:2013-01-05 17:56:42

标签: c# visual-studio-2010 winapi

我在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有人知道解决方案吗? 提前致谢。

2 个答案:

答案 0 :(得分:5)

SendMessagePostMessage工作正常 - 但在Windows中发送击键并不像您想象的那么简单。发送WM_KEYDOWNWM_KEYUP消息只是发送输入的可靠信息。邮件正在发送,但您发送给它们的窗口忽略了它们。

  1. 未正确管理键盘状态:You can't simulate keyboard input with PostMessage
  2. Windows应用程序有许多不同的窗口,主窗口可能不是句柄键盘输入。在Windows keystorkes中,转到焦点窗口 - 可能不是主窗口 - 例如,可以考虑主MS Word窗口和子文档窗口。
  3. F1这样的命令通常被实现为keyboard accelerators,可以发送WM_COMMAND条消息 - 我不会假冒WM_KEYDOWN& WM_KEYUP条消息会触发它们。

答案 1 :(得分:2)

是的,这段代码通常不会起作用。它首先发布WM_KEYDOWN / UP,而不是发送。但更严重的是,MainWindowHandle属性通常不是用于接收键盘输入的窗口的句柄。它通常是框架窗口,显示菜单和工具栏等内容。接收输入的窗口通常是框架窗口的子窗口。像TextBox控件一样。记事本是以这种方式构建的应用程序的示例。

使用Spy ++工具深入了解特定应用程序的窗口层次结构。

否则,使这个代码变得通用的唯一希望是将主窗口置于前台(pinvoke SetForegroundWindow)并模拟键盘笔划(pinvoke SendInput)。