从一个线程我将消息发送到窗口过程中的主线程。 但它没有成功。当我从同一个线程发送消息时 - 一切正常
include "stdafx.h"
#include <Windows.h>
#include <atlbase.h>
#define MAX_THREADS 1
HWND m_wnd;
enum
{
EVENT_CALL = (WM_APP + 0x30),
};
static LRESULT CALLBACK function_call()
{
//some code
int test = 0;
return 0;
}
static LRESULT CALLBACK http_message_proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case EVENT_CALL:
function_call();
return 0;
}
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
void CreateNotifyWnd()
{
WNDCLASSEX w = { 0 };
w.cbSize = sizeof(w);
w.hInstance = (HINSTANCE)&__ImageBase;
w.lpszClassName = L"uistone_http_event_wnd";
w.lpfnWndProc = http_message_proc;
::RegisterClassEx(&w);
int error = GetLastError();
m_wnd = ::CreateWindowEx(0, w.lpszClassName, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, w.hInstance, 0);
error = GetLastError();
}
DWORD WINAPI SendThread(void* request_param)
{
::SendNotifyMessage(m_wnd, EVENT_CALL, 11, 12);
int error = GetLastError();
return 0;
}
int main()
{
CreateNotifyWnd();
HANDLE hThreadArray[MAX_THREADS];
hThreadArray[0] = CreateThread(nullptr, 0, SendThread, nullptr, 0, nullptr);
//::SendNotifyMessage(m_wnd, EVENT_CALL, 11, 12);
WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);
return 0;
}
为什么我无法从其他线程捕获邮件? 感谢。
答案 0 :(得分:1)
这是记录在案的行为。这是SendNotifyMessage文档中的相关部分:
如果窗口是由调用线程创建的,则SendNotifyMessage会调用窗口的窗口过程,并且在窗口过程处理完消息之前不会返回。 如果窗口是由不同的线程创建的,SendNotifyMessage会将消息传递给窗口过程并立即返回;它不会等待窗口过程完成处理消息。
当与在同一线程上创建的窗口一起使用时,这似乎有效,因为当您调用SendNotifyMessage
时,该函数会在返回之前同步调用与目标窗口关联的窗口过程。
如果调用跨越线程,另一方面,您必须为 - now queued - 消息运行消息循环以获取并传递给窗口过程 1)。您的应用程序没有运行消息循环,并且在消息到达目标窗口之前退出。
要解决此问题,您必须运行消息循环。这可能是也可能不是解决问题的正确方法。由于我们不知道您要解决的问题,我们无法提出潜在的优越方法和解决方案。
<小时/> 1) 见About Messages and Message Queues: Message Routing。