【问题标题】:WinApi SendMessage/PostMessage doesn't work on my Computer?WinApi SendMessage/PostMessage 在我的电脑上不起作用?
【发布时间】:2013-01-06 02:26:14
【问题描述】:

我用 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 的朋友计算机)都运行得又快又好。

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

【问题讨论】:

  • 当然它可以工作,否则你不会得到一个 GUI 桌面,只是一个 DOS 提示符。您希望将消息 0x100 和 0x101 准确地发送到 do 什么?
  • 我只是说它会像在其他机器上一样工作。我不知道为什么除了我的笔记本(我用来编程)之外它在任何地方都可以工作。

标签: c# visual-studio-2010 winapi


【解决方案1】:

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

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

【讨论】:

  • 不工作的可能原因是另一个应用程序阻止了 F1 事件。如果我错了,我会测试它并取消选中答案。
  • 正确。这个应用程序是 TeamViewer 8。请注意。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2014-12-19
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多