2012-02-19 64 views
1

我不太瞭解GetWindowText如何在與調用方相同的線程上工作。如果GetWindowText阻塞,直到消息被處理,線程怎麼能調用DispatchMessage?它在GetWindowText內被封鎖。這是否意味着GetWindowText必須始終從操作消息循環的單獨線程調用?同步使用GetWindowText

回答

7

GetWindowText只是SendMessage(WM_GETTEXT)的薄包裝。

發送到窗口的消息總是在創建窗口的線程中處理(窗口具有「線程關聯」)。發送的消息不通過DispatchMessage,而是GetMessage(或PeekMessageMsgWaitForMultipleObjects)將直接調用窗口過程,以處理從另一個線程發送的消息。如果消息來自同一個線程,SendMessage將調用窗口過程。


SendMessage documentation說:

SendMessage函數調用指定的窗口的窗口過程,並不會返回,直到窗口過程已經處理了該消息。

而且the GetMessage documentation says

檢索從調用線程的消息隊列中的消息。該功能調度傳入的已發送消息,直到發佈的消息可用於檢索。

the PeekMessage docs

急件入方向帶發送的消息,檢查一個發佈消息的線程的消息隊列,和檢索消息(如果有的話)。


發送消息的行爲之前已突出了Raymond Chen's excellent blog, The Old New Thing,所有的Win32開發者應該訂閱:

如果您使用上述任何發送型功能發送消息發送到屬於發送線程的窗口,則該呼叫將同步進行。

回想SendMessage直接將消息傳送到窗口過程;消息泵永遠不會看到它。


當然,還有相關這裏找到在計算器上的問題:

+0

我看到了它的工作通過發送一個 信息。我沒有看到它沒有像大多數消息那樣排隊消息。 – Puppy 2012-02-19 04:26:16

+0

@DeadMG:你肯定有足夠的權利來解決一些基本的RTFM問題,我只是很驚訝,你不知道在哪裏尋找這個問題。 – 2012-02-19 04:30:56