Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 跨应用程序消息的PostMessage_C++_Windows - Fatal编程技术网

C++ 跨应用程序消息的PostMessage

C++ 跨应用程序消息的PostMessage,c++,windows,C++,Windows,我正在尝试向另一个应用程序发送击键。我可以成功地找到窗口句柄,因为使用SendMessage完全按照预期工作 但是,当我将SendMessage切换到PostMessage时,应用程序不再接收消息 然而,我确实找到了一个解决方法,使用HWND_广播作为窗口句柄,它工作得很好,但不是实现它的理想方式 我想问的是,我有一个有效的hWnd,如何使用PostMessage而不是SendMessage发送它 编辑 这就是我想做的 HWND Target = FindWindow(0, "Window Ti

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

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

然而,我确实找到了一个解决方法,使用HWND_广播作为窗口句柄,它工作得很好,但不是实现它的理想方式

我想问的是,我有一个有效的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 Target=FindWindow(0,“窗口标题在此显示”);

LPARAM LPARAM=(1 |(57当消息编号介于0和
WM\u USER
-1之间时,
PostMessage
功能不起作用。使用该功能注册您自己的消息。

当消息编号介于0和
WM\u USER
-1之间时,
PostMessage
功能不起作用。使用该功能注册您自己的消息。

发送消息邮件和已发布的邮件采用完全不同的路由。目标接收您已发布的邮件,它只是对其进行筛选或将其发送到另一个窗口。它可以随心所欲地对其进行处理。当您发送邮件时,它会直接进入窗口过程而不进行筛选,因此很可能是该问题的原因

我不知道HWND_广播为什么会起作用;我最好的猜测是目标以外的窗口正在处理消息。或者它甚至被发送到目标以外的其他窗口。(您知道HWND_广播将消息发送到每个顶级窗口)

有一个Win32 API函数设计用于发送输入,SendInput(),它将消息像用户按键一样放置在输入队列中。但是,这不允许您指定窗口,它会将其输入发送到活动窗口。要使用它,您必须激活并将焦点切换到目标,这意味着用户会看到该窗口移到顶部(就像您将Alt标记到它一样)。在同一条路线上,VBScript有一个SendKeys()函数,该函数执行相同的操作,但更易于使用


作为最后一种选择,您可以使用SendMessageCallback(),这将为您提供异步SendMessage的行为,我认为这是您想要的。(与PostMessage不同。已发布的消息进入已发布的消息队列,已发送的消息直接传递)

发送的消息和发布的消息采用完全不同的路由。目标接收到您发布的消息,它只是对其进行筛选或将其发送到另一个窗口。它可以随心所欲地使用它。当您发送消息时,它会直接进入窗口过程而不进行筛选,因此最有可能的原因是有争议

我不知道HWND_广播为什么会起作用;我最好的猜测是目标以外的窗口正在处理消息。或者它甚至被发送到目标以外的其他窗口。(您知道HWND_广播将消息发送到每个顶级窗口)

有一个Win32 API函数设计用于发送输入,SendInput(),它将消息像用户按键一样放置在输入队列中。但是,这不允许您指定窗口,它会将其输入发送到活动窗口。要使用它,您必须激活并将焦点切换到目标,这意味着用户会看到该窗口移到顶部(就像您将Alt标记到它一样)。在同一条路线上,VBScript有一个SendKeys()函数,该函数执行相同的操作,但更易于使用

作为最后一种选择,您可以使用SendMessageCallback(),这将为您提供异步SendMessage的行为,我认为这是您想要的。(与PostMessage不同。已发布的消息进入已发布的消息队列,已发送的消息直接传递)

*对于LPRAM,请转到此处,更改LPRAM的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"); 
void SendString(HWND h,char*text)
{
int len=strlen(文本);
对于(int i=0;i
*对于LPRAM,请转到此处,更改LPRAM的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"); 
void SendString(HWND h,char*text)
{
int len=strlen(文本);
对于(int i=0;i
您正在发布什么消息以及参数是什么?哪个操作系统?HWND_广播,它无法将消息发布到子窗口。GetLastError()的返回值是多少PostMessage之后?您正在发布什么消息?参数是什么?哪个操作系统?HWND_广播,它无法将消息发布到子窗口。PostMessage之后GetLastError()的返回值是多少?