【问题标题】:PostMessage for cross application messagesPostMessage 用于跨应用程序消息
【发布时间】:2010-11-27 16:52:42
【问题描述】:

我正在尝试将击键发送到另一个应用程序。我可以成功找到窗口句柄,因为使用 SendMessage 完全按照预期工作。

但是,当我将 SendMessage 切换到 PostMessage 时,应用程序不再收到消息。

但是,我确实找到了一种解决方法,即使用 HWND_BROADCAST 作为窗口句柄,它工作正常,但不是理想的解决方法。

我要问的是,我有一个有效的 hWnd,如何使用 PostMessage 而不是 SendMessage 向它发送消息?

编辑 这就是我想要做的。

HWND Target = FindWindow(0, "Window Title Goes Here");
LPARAM lParam = (1 | (57<<16)); // OEM Code and Repeat for WM_KEYDOWN
WPARAM wParam = VK_SPACE;
PostMessage(HWND_BROADCAST, WM_KEYDOWN, wParam, lParam); // Works
PostMessage(Target, WM_KEYDOWN, wParam, lParam); // Doesn't Work
SendMessage(Target, WM_KEYDOWN, wParam, lParam); // Works, but I need Post

【问题讨论】:

  • 您要发布什么消息以及参数是什么?
  • 哪个操作系统? HWND_BROADCAST,它不能向子窗口发布消息。
  • PostMessage 之后 GetLastError() 的返回值是多少?

标签: c++ windows


【解决方案1】:

当消息编号介于 0 和 WM_USER-1 之间时,PostMessage 函数不起作用。使用RegisterWindowMessage函数注册你自己的消息。

【讨论】:

    【解决方案2】:

    发送消息和发布消息使用完全不同的路由器。 Target 正在接收您发布的消息,它只是过滤或将其分派到另一个窗口。它可以随心所欲地做任何事情。当您发送消息时,它会直接进入窗口过程而不进行过滤,因此很可能是导致该问题的原因。

    我不知道为什么 HWND_BROADCAST 有效;我最好的猜测是 Target 以外的窗口正在处理该消息。或者它甚至可能被发送到与目标不同的窗口。 (您确实意识到 HWND_BROADCAST 将消息发送到每个顶级窗口)

    有一个设计用于发送输入的 Win32 API 函数,SendInput(),它将消息放在输入队列中,就像用户按键一样。但是,这不允许您指定窗口,它会将其输入发送到活动窗口。要使用它,您必须激活并将焦点切换到 Target,这意味着用户会看到该窗口移动到顶部(就像您使用 Alt-Tabbed 一样)。同样,VBScript 有一个 SendKeys() 函数,它做同样的事情,但更容易使用。

    作为最后的替代方案,您可以使用 SendMessageCallback() 这将为您提供异步 SendMessage 的行为,这是我假设您想要的。 (和PostMessage不同,发布消息进入发布消息队列,发送消息直接投递)

    【讨论】:

      【解决方案3】:

      *对于 lparam 转到此处http://msdn.microsoft.com/en-us/library/ms646280%28v=vs.85%29.aspx,更改 lParam 的 32 位 (31...3 2 1 0)。一旦你有了你想要的参数(cRepeat、Scancode 等)的二进制语句,将其转换为十六进制。

      试试这个:

      void SendString(HWND h, char *text)
      {
         int len = strlen(text);
         for(int i = 0; i < len; i++)
         PostMessage(h, WM_CHAR, text[i], 0);
      }
      
      
      
      HWND Target = FindWindow(0, "Window Title Goes Here");
      LPARAM lParam = //The hexadecimal value matching with the parameters you want* example 0x29A1. 
      WPARAM wParam = VK_SPACE;
      PostMessage(HWND_BROADCAST, WM_KEYDOWN, wParam, lParam); 
      PostMessage(Target, WM_KEYDOWN, wParam, lParam); 
      SendString(Target, (char*)"themessageyouwant\n"); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        • 2014-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-07
        • 1970-01-01
        相关资源
        最近更新 更多