私は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 Phoneアプリケーションの同期化などの非同期操作を実行する方法はありますか?
- 2. Windowsフォームでの非同期実行
- 3. cygwinでguiアプリケーションを実行
- 4. Qtでの非同期アプリケーションの実行
- 5. 同期レルム - 飛行機モード
- 6. CoreOSの中でGUIアプリケーションを実行できますか?
- 7. GUIアプリケーションから端末コマンドを実行しますか?
- 8. GUIの同時実行
- 9. intellijのアイデアでGUIアプリケーションを実行
- 10. .NET:コールバックがGUIスレッド上で実行される非同期ソケット?
- 11. 非同期操作を実行するカスタムWindowsワークフローアクティビティの実装
- 12. PCLとWindows Phoneアプリケーションでの非同期スコープの実装
- 13. Android MediaCodecは非同期モードでは同期モードよりも遅いですか?
- 14. VisualStudioのWindows GUIアプリケーション
- 15. WindowsでPHPスクリプトを非同期で実行する方法は?
- 16. 非同期モード
- 17. Windowsで長期実行コンソールアプリケーションをホストしていますか?
- 18. どのようにコードを同期で実行しますか?
- 19. Windows 7は - プログラムXP互換モードで実行するアプリケーションを設定
- 20. WindowsサービスからGUIアプリケーションをロードする
- 21. フォームデザイナーファイルをC#Windowsアプリケーションで実行モードから特定する方法はありますか?
- 22. WindowsアプリケーションでSignalRを使用してクライアントを同期する
- 23. 信頼できるアクターブレークターンベースの同時実行性で非同期呼び出しを実行しますか?
- 24. JMeterはJTLレポートでは、非GUIモードでのJMeterスクリプトファイルを実行し、例外エラー
- 25. 非同期メソッドは別のスレッドで実行しますか?
- 26. Wakanda callMethod同期モード
- 27. 同期呼び出し内での非同期タスクの実行
- 28. IoTアプリケーションの同期モードはどのように処理されますか?
- 29. ユニバーサルWindowsアプリケーションのデータ同期(デスクトップ)Sqlite
- 30. 同期コードの非同期実行
したがって、PostMessageをSendMessageのように動作させる方法はありませんか?もしそうなら、私が見る唯一の方法は、すべてのPostMessage呼び出しをSendMessageで一時的に置き換えることです。 – ks1322
いいえ、Postmessageをsendmessageのように動作させる方法はありません。ポストメッセージは非同期で、メッセージをメッセージキューに送信します。メッセージを直接バイパスし、アプリケーションwndprocを直接呼び出します。 PostMessageを呼び出すとすぐに返されますが、呼び出しスレッドでsendmessageブロックが返されます。渡されたhwndのwndprocを呼び出してwndprocにアクセスします。 – johnathon
この回答はシングルスレッドの場合にも当てはまります。 'SendMessage'は、あなたのスレッドではなく、スレッドのウィンドウのWindowProcを呼び出さなければならないので、スレッド間で違った働きをします。各スレッドには独自の呼び出しスタックがあるため、SendMessage呼び出しはWndProc呼び出しと同じスタックにはありません。 – MSalters