1

我在 c# 中编写了一些测试代码(使用 WPF 表单)来检查 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 的朋友计算机)都可以快速运行。

有没有人有同样的问题?也许有人知道解决方案吗?提前致谢。

4

2 回答 2

5

SendMessage并且PostMessage工作正常 - 但在 Windows 中发送击键并不像您想象的那么简单。仅发送WM_KEYDOWNWM_KEYUP消息是不可靠的发送输入。正在发送消息,但您将它们发送到的窗口忽略它们。

  1. 未正确管理键盘状态:您无法使用 PostMessage 模拟键盘输入
  2. Windows 应用程序有许多不同的窗口,主窗口可能不是键盘输入的句柄。在 Windows 中,keystorkes 转到焦点窗口(可能不是主窗口),例如考虑 MS Word 主窗口和子文档窗口。
  3. 像这样的命令F1通常被实现为发送消息的键盘加速器WM_COMMAND——我不相信假WM_KEYDOWN&WM_KEYUP消息会触发它们。
于 2013-01-05T18:19:06.460 回答
2

是的,这段代码一般不会起作用。它以 WM_KEYDOWN/UP 开始发布,而不是发送。但更严重的是 MainWindowHandle 属性通常不是设计用于接收键盘输入的窗口的句柄。它通常是一个框架窗口,显示菜单和工具栏之类的东西。接收输入的窗口通常是框架窗口的窗口。就像一个 TextBox 控件。记事本就是以这种方式构建的应用程序的一个示例。

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

否则,使这段代码变得通用的唯一希望是将主窗口带到前台(pinvoke SetForegroundWindow)并模拟键盘敲击(pinvoke SendInput)。

于 2013-01-05T18:26:14.560 回答