SendNotifyMessage不发送正确的消息

时间:2017-01-30 12:32:42

标签: c++ multithreading winapi

从一个线程我将消息发送到窗口过程中的主线程。 但它没有成功。当我从同一个线程发送消息时 - 一切正常

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;
}

为什么我无法从其他线程捕获邮件? 感谢。

1 个答案:

答案 0 :(得分:1)

这是记录在案的行为。这是SendNotifyMessage文档中的相关部分:

  

如果窗口是由调用线程创建的,则SendNotifyMessage会调用窗口的窗口过程,并且在窗口过程处理完消息之前不会返回。 如果窗口是由不同的线程创建的,SendNotifyMessage会将消息传递给窗口过程并立即返回;它不会等待窗口过程完成处理消息。

当与在同一线程上创建的窗口一起使用时,这似乎有效,因为当您调用SendNotifyMessage时,该函数会在返回之前同步调用与目标窗口关联的窗口过程。

如果调用跨越线程,另一方面,您必须为 - now queued - 消息运行消息循环以获取并传递给窗口过程 1)。您的应用程序没有运行消息循环,并且在消息到达目标窗口之前退出。

要解决此问题,您必须运行消息循环。这可能是也可能不是解决问题的正确方法。由于我们不知道您要解决的问题,我们无法提出潜在的优越方法和解决方案。

<小时/> 1) About Messages and Message Queues: Message Routing