我正在尝试将击键发送到另一个应用程序。我可以成功找到窗口句柄,因为使用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
答案 0 :(得分:1)
当消息号介于0和PostMessage
- 1之间时,WM_USER
功能不起作用。使用RegisterWindowMessage功能注册您自己的消息。
答案 1 :(得分:0)
已发送的消息和已发布的消息采用完全不同的路由。 Target正在收到您发布的消息,它只是过滤或将其分发到另一个窗口。它可以用它做任何想做的事情。当您发送消息时,它会直接进入窗口过程而不进行过滤,因此很可能是导致该问题的原因。
我不知道为什么HWND_BROADCAST正在工作;我最好的猜测是除了Target之外的窗口正在处理该消息。或者它甚至可能被发送到与Target不同的窗口。 (您确实意识到HWND_BROADCAST将消息发送到每个顶级窗口)
有一个Win32 API函数用于发送输入 SendInput(),它将消息放在输入队列中,就像用户按键一样。但是,这不允许您指定窗口,它将其输入发送到活动窗口。要使用它,您必须激活并将焦点切换到Target,这意味着用户会看到该窗口移动到顶部(就像您使用Alt-Tabbed一样)。沿着同样的路线,VBScript有一个 SendKeys()功能,可以做同样的事情,但更容易使用。
作为最后的替代方案,您可以使用 SendMessageCallback(),它将为您提供异步SendMessage的行为,这是我想要的。 (并且与PostMessage不同。发布的消息进入发布的消息队列,发送的消息直接发送)
答案 2 :(得分:0)
*对于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");