2017-01-30 99 views
0

從一個線程我發送消息到窗口過程中的主線程。 但它不成功。當我從同一線程發送消息時 - 一切正常SendNotifyMessage不發送正確的消息

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

您似乎沒有消息循環... https://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows – UKMonkey

+0

1)您的消息循環在哪裏? 2)如何驗證您的代碼是否捕獲到消息? –

+0

http_message_proc是程序中循環的函數 –

回答

1

這是記錄的行爲。這是有關部分從SendNotifyMessage文檔:

如果該窗口是由調用線程創建的,SendNotifyMessage調用窗口過程窗口,並不會返回,直到窗口過程已經處理了該消息。 如果窗口是由其他線程創建的,則SendNotifyMessage將消息傳遞給窗口過程並立即返回;它不會等待窗口過程完成消息的處理。

這似乎與在同一線程上創建一個窗口使用時的工作,因爲當你調用SendNotifyMessage,功能同步調用返回到前與目標窗口相關的窗口過程。

如果調用通過線程,另一方面,您將不得不運行消息循環 - 現在排隊 - 消息被拿起並傳遞給窗口過程1)。您的應用程序不會運行消息循環,並在消息到達目標窗口之前退出。

要解決這個問題,你必須運行一個消息循環。這可能是也可能不是解決問題的正確方法。由於我們不知道,您嘗試解決什麼問題,因此我們無法建議潛在的優質方法和解決方案。


1) 參見About Messages and Message Queues: Message Routing

+0

我在'CreateNotifyWnd'中爲窗口創建了消息循環 –

+0

@MartinJuin:不在您發佈的代碼中。您註冊了一個[窗口過程](https://msdn.microsoft.com/en-us/library/windows/desktop/ms632593.aspx),但沒有消耗消息隊列或調度消息的循環。 – IInspectable

+0

好吧,我明白了 - 這是我的錯誤 - 沒有循環。但是我必須寫這個循環,怎麼樣? –