私はWindows上でGUIアプリケーションをデバッグしており、誰がメッセージを送信したのかを知りたい。 linuxでは、私はsynchronized modeでアプリを実行して、コールスタックの送信者を見つけることができます。 Windowsに同等のモードはありますか?WindowsのGUIアプリケーションを同期モードで実行しますか?
答えて
AFAIKこれを行う機能は組み込まれていません。
まず、問題を調査してみましょう。メッセージの送信者が誰であるかを知りたい場合は、です。
- は、送信されたメッセージ(
SendMessage
対PostMessage
)対投稿者:あなたは、Windowsのメッセージ処理は、以下のcriteriasによって分類できることがわかっている必要があります。 - 別のスレッドと送信スレッドのウィンドウに送信されたメッセージ。
- スレッドに投稿されたメッセージ(特定のウィンドウにバインドされていないため、ウィンドウプロシージャによって処理されません)。
あなたは直接SendMessage
(または類似)への呼び出しは、ウィンドウが属するスレッドに発行されたのに対し、メッセージが、ウィンドウに(掲示されていない)を送信するだけで、送信者を追跡することがあります。その場合、コールスタックに送信者が表示されます。
メッセージが別のスレッドから送信された場合は、ではなく、コールスタックで確認してください。コールスタックが現在のスレッドにのみ属するコールチェーンを示すためです。別のスレッドからメッセージが送信されると、システムは次の処理を実行します。
- 発信者スレッドを中断します。
- このメッセージをウィンドウを所有するスレッドのキューに送ります。
- そのスレッドが
GetMessage
(またはそれに類するもの)を呼び出すと、メッセージがウィンドウに送出されます。 - 最後に、OSが呼び出し元スレッドを再開します。
SendMessage
は、ウィンドウプロシージャによって返された結果を返します。
このような場合、発信者を間接的に識別しようとする場合があります。ブレークポイントでプログラムを中断し、SendMessage
などの呼び出しでブロックされた中断されたスレッドを検索しようとします。
最後に、投稿されたメッセージは上記の方法では追跡できません。 PostMessage
の呼び出しに条件付きブレークポイントを設定しようとするかもしれませんが、呼び出し側が別の問題に属している場合は、より複雑になります。
ヴァルドが正しいです。 SendMessageへの呼び出しは、アプリケーションwndprocを直接呼び出します。 PostMessageを呼び出すとメッセージキューにメッセージがポストされ、アプリケーションはメッセージポンプを介してメッセージを受け取ります(ループ、getmessage、translatemessage、dispatchmessage)。つまり、メッセージがSendMessage経由で送信された場合、関数の呼び出し先がコールスタックに表示されます。それがPostMessage経由で送信された場合、それはされません。
- 1. Windowsフォームでの非同期実行
- 2. Windows Phoneアプリケーションの同期化などの非同期操作を実行する方法はありますか?
- 3. Qtでの非同期アプリケーションの実行
- 4. GUIの同時実行
- 5. .NET:コールバックがGUIスレッド上で実行される非同期ソケット?
- 6. GUIアプリケーションから端末コマンドを実行しますか?
- 7. 非同期操作を実行するカスタムWindowsワークフローアクティビティの実装
- 8. intellijのアイデアでGUIアプリケーションを実行
- 9. WindowsでPHPスクリプトを非同期で実行する方法は?
- 10. PCLとWindows Phoneアプリケーションでの非同期スコープの実装
- 11. VisualStudioのWindows GUIアプリケーション
- 12. 非同期メソッドは別のスレッドで実行しますか?
- 13. Windows 7は - プログラムXP互換モードで実行するアプリケーションを設定
- 14. 何とかPromisesで同期ループを実行できますか?
- 15. WindowsアプリケーションでSignalRを使用してクライアントを同期する
- 16. マルチプロセッシングを使用したGUIアプリケーション内での非同期呼び出し
- 17. window.postMessageで同期ドメイン間通信を実行できますか?
- 18. WindowsサービスからGUIアプリケーションをロードする
- 19. 同期と非同期AJAXを同時に実行する
- 20. Django +は非同期プロセスを実行しますか?
- 21. 実行NPMスクリプトを同期
- 22. Windowsサービスでスレッドを使用して非同期にC#メソッドを実行
- 23. guiを表示せずに、Linux上でGUIアプリケーションを実行していますか?
- 24. なぜ非同期アクションが完了するまで同期アクションが実行されませんでしたか?
- 25. 別のウィンドウ内でWindowsアプリケーションを実行
- 26. Blackberry:potraitモードでアプリケーションをロックしますか?
- 27. forEachを非同期の滝のように実行します。
- 28. Luaでの同期コマンドの実行
- 29. のActiveRecordを実行する非同期
- 30. 同じiis7サーバーで統合モードとクラシックモードを実行しています
したがって、PostMessageをSendMessageのように動作させる方法はありませんか?もしそうなら、私が見る唯一の方法は、すべてのPostMessage呼び出しをSendMessageで一時的に置き換えることです。 – ks1322
いいえ、Postmessageをsendmessageのように動作させる方法はありません。ポストメッセージは非同期で、メッセージをメッセージキューに送信します。メッセージを直接バイパスし、アプリケーションwndprocを直接呼び出します。 PostMessageを呼び出すとすぐに返されますが、呼び出しスレッドでsendmessageブロックが返されます。渡されたhwndのwndprocを呼び出してwndprocにアクセスします。 – johnathon
この回答はシングルスレッドの場合にも当てはまります。 'SendMessage'は、あなたのスレッドではなく、スレッドのウィンドウのWindowProcを呼び出さなければならないので、スレッド間で違った働きをします。各スレッドには独自の呼び出しスタックがあるため、SendMessage呼び出しはWndProc呼び出しと同じスタックにはありません。 – MSalters