2011-08-15 30 views
4

我有一種情況,我希望SendMessage上創建的窗口的另一個線程比正在調用SendMessage的窗口。如何將SendMessage()發送到在另一個線程上創建的窗口?

默認的行爲似乎是塊永遠,而不是工作。

所以我改變了呼叫PostMessage,這並沒有阻止發送線程,但從來沒有出現消息在預期的窗口到達。

所以我怎麼SendMessage到一個單獨的線程創建的窗口,或者這是不可能的?

+0

前段時間有類似的問題。這是C#,但它有點語言不可知論。 http://stackoverflow.com/questions/6165428/sendinput-to-minimized-window/6165532#6165532 – Skurmedel

+3

Downvoter,_how這是一個壞問題_? – bobobobo

+0

如果你發佈一些代碼:SendMessage/PostMessage調用和消息處理程序,它將會有所幫助。 – hamstergene

回答

1

您創建的每個控件屬於創建它的線程,這意味着的WndProc該控件將創建該控件的線程中運行。您可以將SendMessage和PostMessage的消息隨意發送給任何控件。

+0

這是否意味着程序的所有gui元素_must_都將在主線程上創建? – bobobobo

+0

@bobobobo是的,正好。 –

+2

這絕對是不正確的*:SendMessage存在的原因之一是允許一個GUI線程與另一個GUI線程進行通信:它執行一系列內務工作來管理線程之間的同步。擁有一個擁有許多GUI線程的進程是完全合法的,每個線程都擁有Windows - 假設每個線程都正確處理消息。話雖如此,通常是一個更簡單,更合適的設計,只有一個GUI線程,非GUI工作人員適當。 – BrendanMcK

1

PostThreadMessage函數將消息發佈到指定線程的消息隊列中。您可以指定郵件將發佈到的線程的標識符。你想要嗎?

1

擁有目標窗口的線程在做什麼?它需要抽取消息以便能夠接收發送或發佈給它的消息。通常這是通過具有GetMessage/TranslateMessage/DispatchMessage循環來完成的。如果線程正在做其他事情 - 例如阻塞等待事件或互斥鎖或IO完成,或者在執行計算的某個其他循環中忙,它將不會接收消息:SendMessage到線程將阻塞,並且PostMessage將發佈但未獲得交付。

如果目標線程需要兩個管理事件或類似的,它也擁有一個窗口,你可能需要在線程的消息循環使用MsgWaitForMultipleObjects。

1

您正在陷入僵局。例如,如果SendMessage爲另一個線程,那麼該線程中的windowProc會將SendMessage返回到您的窗口,它們將鎖定永久等待對方。

您需要修復PostMessage(它確實提供了消息,在您的代碼中存在錯誤),或者非常小心誰打電話給誰以及何時。

爲了防止那些忙或掛線,有SendMessageTimeout

0

CWnd :: PostMessage和CWnd :: SendMessage的問題是相同的。消息被推出,而沒有被任何東西接收。 SendMessage被設計阻塞;它的工作是阻止線程,直到收到消息。

MSDN說,這大約SendMessage

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

可以使用CWnd::PostThreadMessagewinapi PostMessage將消息發送到另一個線程上的窗口。在創建窗口時,可以使用GetSafeHwnd()獲取句柄,或者可以在創建線程時使用線程ID。

相關問題