我有一種情況,我希望SendMessage
在上創建的窗口的另一個線程比正在調用SendMessage
的窗口。如何將SendMessage()發送到在另一個線程上創建的窗口?
默認的行爲似乎是塊永遠,而不是工作。
所以我改變了呼叫PostMessage
,這並沒有阻止發送線程,但從來沒有出現消息在預期的窗口到達。
所以我怎麼SendMessage
到一個單獨的線程創建的窗口,或者這是不可能的?
我有一種情況,我希望SendMessage
在上創建的窗口的另一個線程比正在調用SendMessage
的窗口。如何將SendMessage()發送到在另一個線程上創建的窗口?
默認的行爲似乎是塊永遠,而不是工作。
所以我改變了呼叫PostMessage
,這並沒有阻止發送線程,但從來沒有出現消息在預期的窗口到達。
所以我怎麼SendMessage
到一個單獨的線程創建的窗口,或者這是不可能的?
您創建的每個控件屬於創建它的線程,這意味着的WndProc該控件將創建該控件的線程中運行。您可以將SendMessage和PostMessage的消息隨意發送給任何控件。
這是否意味着程序的所有gui元素_must_都將在主線程上創建? – bobobobo
@bobobobo是的,正好。 –
這絕對是不正確的*:SendMessage存在的原因之一是允許一個GUI線程與另一個GUI線程進行通信:它執行一系列內務工作來管理線程之間的同步。擁有一個擁有許多GUI線程的進程是完全合法的,每個線程都擁有Windows - 假設每個線程都正確處理消息。話雖如此,通常是一個更簡單,更合適的設計,只有一個GUI線程,非GUI工作人員適當。 – BrendanMcK
PostThreadMessage函數將消息發佈到指定線程的消息隊列中。您可以指定郵件將發佈到的線程的標識符。你想要嗎?
擁有目標窗口的線程在做什麼?它需要抽取消息以便能夠接收發送或發佈給它的消息。通常這是通過具有GetMessage/TranslateMessage/DispatchMessage循環來完成的。如果線程正在做其他事情 - 例如阻塞等待事件或互斥鎖或IO完成,或者在執行計算的某個其他循環中忙,它將不會接收消息:SendMessage到線程將阻塞,並且PostMessage將發佈但未獲得交付。
如果目標線程需要兩個管理事件或類似的,它也擁有一個窗口,你可能需要在線程的消息循環使用MsgWaitForMultipleObjects。
您正在陷入僵局。例如,如果SendMessage
爲另一個線程,那麼該線程中的windowProc會將SendMessage
返回到您的窗口,它們將鎖定永久等待對方。
您需要修復PostMessage
(它確實提供了消息,在您的代碼中存在錯誤),或者非常小心誰打電話給誰以及何時。
爲了防止那些忙或掛線,有SendMessageTimeout
。
CWnd :: PostMessage和CWnd :: SendMessage的問題是相同的。消息被推出,而沒有被任何東西接收。 SendMessage被設計阻塞;它的工作是阻止線程,直到收到消息。
MSDN說,這大約SendMessage:
「SendMessage函數調用指定的 窗口的窗口過程,並不會返回,直到窗口過程已經處理 的消息。」
可以使用CWnd::PostThreadMessage或winapi PostMessage將消息發送到另一個線程上的窗口。在創建窗口時,可以使用GetSafeHwnd()獲取句柄,或者可以在創建線程時使用線程ID。
前段時間有類似的問題。這是C#,但它有點語言不可知論。 http://stackoverflow.com/questions/6165428/sendinput-to-minimized-window/6165532#6165532 – Skurmedel
Downvoter,_how這是一個壞問題_? – bobobobo
如果你發佈一些代碼:SendMessage/PostMessage調用和消息處理程序,它將會有所幫助。 – hamstergene