2012-03-17 172 views
2

通常WinAPI的消息循環看起來是這樣的:WinAPI的 - 與自己的回調消息循環

MSG msg; 
while (GetMessage(&msg, hwnd, 0, 0)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

是否允許不調用DispatchMessage函數(),但來處理自己的郵件?如果沒有,我怎麼能很好地處理這種行爲,同時避免全局變量和線程問題?

編輯: 我基本上想使用我自己的回調函數,它沒有WndProc簽名。但我想不出使用靜態或全局變量來調用WndProc函數的方法。 [這將需要鎖定,我認爲這不是你可以用回調函數做的最好的事情,可能會被頻繁地調用。]

感謝您的幫助。

+0

'避免全局變量和線程問題'你能解釋一下你的意思嗎? – 2012-03-17 23:25:39

+0

@Jesse:我希望他意味着與使用非常量的全局變量相關的常見問題,這些變量是由多個線程訪問的。每個使用它們的線程都必須使用鎖定機制來訪問它們。 – 2012-03-17 23:41:12

+0

@Jesse編輯。希望現在好一點。 – cooky451 2012-03-17 23:42:17

回答

2

您可以在那裏對消息作出反應,但您仍然需要/想要調用DispatchMessage並實際處理正常的wndproc中的消息。我很樂意多說避免全局性和/或線程問題,但如果沒有更多關於你想避免的細節的評論,很難評論。

+0

消息循環所在的函數調用另一個函數,但可能發生於多個線程/位置。此外,創建窗口類時,我無法將此函數定義爲回調函數,因爲它沒有正確的簽名。我需要一種方法來調用這個回調,而不需要調用DefWindowProc。但與WndProc函數進行通信的唯一方式似乎超過了靜態/全局。 – cooky451 2012-03-17 23:30:45

+1

'他唯一能夠與WndProc函數進行通信的方式似乎超過了靜態/全局'?? - 有兩個32位'wParam,lParam'參數。這些可能包含一個指向你的函數的指針和一個指向儘可能多的參數的結構指針,或者你可能希望的任何類的實例。 – 2012-03-17 23:39:50

+0

@MartinJames:當然,你是對的,但爲了讓你的答案完全解決他的疑慮,你需要添加這個評論。 – 2012-03-17 23:43:47

1

是的,如果你願意,你可以自己處理消息。我通常將結果字段設置爲0,但Windows僅使用此字段來處理幾條消息。

+0

將結果字段設置爲0意味着什麼?什麼結果字段? - 這裏似乎有兩種觀點,所以多一點解釋會很好。 – cooky451 2012-03-17 23:41:18

+0

msg結構中有一個int結果字段。 – 2012-03-19 11:06:07

3

是否允許不調用DispatchMessage(),而是自己處理消息?如果沒有,我怎麼能很好地處理這種行爲,同時避免全局變量和線程問題?

如果您計劃使用多個線程在你的GUI,然後創建一個窗口,需要管理它自己的消息隊列每個線程。

從這個頁面:http://msdn.microsoft.com/en-us/library/ms810439.aspx

更改消息循環

應用程序使用多個線程必須包括在每個 線程創建窗口消息循環。窗口的消息循環和窗口過程 必須由創建窗口的線程處理。 如果消息循環未駐留在創建窗口的相同線程中,則DispatchMessage函數將不會獲取 窗口的消息。因此,該窗口將出現,但不會顯示激活 ,並且不會像您所期望的那樣重新繪製,移動,接收鼠標消息或通常工作 。