![](/img/trans.png)
[英]Is it possible to run a Windows console application together a with a Windows GUI application?
[英]Run windows GUI application in synchronized mode?
我正在 windows 上調試 GUI 應用程序,我想找出誰是某些消息的發送者。 在 linux 上,我可以在同步模式下運行應用程序並在調用堆棧中找到發送者。 windows中是否有等效模式?
AFAIK 沒有內置的能力來做到這一點。
但是,讓我們首先調查一下這個問題。 你想知道誰是消息的發送者。 但是,您應該知道 windows 消息處理可以按以下標准分類:
PostMessage
與SendMessage
)。 只有當消息被發送(未發布)到 window 時,您才可以直接跟蹤發件人,而對SendMessage
(或類似的)的調用是在 window 所屬的線程中發出的。 在這種情況下,您將在調用堆棧中看到發件人。
如果消息是從另一個線程發送的 - 您將不會在調用堆棧中看到它。 僅僅是因為調用棧只顯示了屬於當前線程的調用鏈。 當從另一個線程發送消息時,系統執行以下操作:
GetMessage
(或類似的)時 - 消息被分派到 window。SendMessage
返回 window 過程返回的結果。 在這種情況下,您可以嘗試間接識別調用者。 使用斷點中斷您的程序,並嘗試搜索掛起的線程,這些線程在對SendMessage
或類似的調用中被阻塞。
最后,通過上述方法無法跟蹤發布的消息。 您可以嘗試在對PostMessage
的調用上放置條件斷點,但如果調用者屬於另一個問題 - 這將更加復雜。
瓦爾多是正確的。 對 SendMessage 的調用直接調用您的應用程序 wndproc。 對 PostMessage 的調用將消息發布到消息隊列,然后您的應用程序通過消息泵(循環、getmessage、translatemessage、dispatchmessage)接收消息。 所以,就像他說的,如果消息是通過 SendMessage 發送的,那么 function 的被調用者將顯示在調用堆棧中。 如果它是通過 PostMessage 發送的,則不會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.