2011-05-31 17 views

答えて

1

AFAIKこれを行う機能は組み込まれていません。

まず、問題を調査してみましょう。メッセージの送信者が誰であるかを知りたい場合は、です。

  1. は、送信されたメッセージ(SendMessagePostMessage)対投稿者:あなたは、Windowsのメッセージ処理は、以下のcriteriasによって分類できることがわかっている必要があります。
  2. 別のスレッドと送信スレッドのウィンドウに送信されたメッセージ。
  3. スレッドに投稿されたメッセージ(特定のウィンドウにバインドされていないため、ウィンドウプロシージャによって処理されません)。

あなたは直接SendMessage(または類似)への呼び出しは、ウィンドウが属するスレッドに発行されたのに対し、メッセージが、ウィンドウに(掲示されていない)を送信するだけで、送信者を追跡することがあります。その場合、コールスタックに送信者が表示されます。

メッセージが別のスレッドから送信された場合は、ではなく、コールスタックで確認してください。コールスタックが現在のスレッドにのみ属するコールチェーンを示すためです。別のスレッドからメッセージが送信されると、システムは次の処理を実行します。

  1. 発信者スレッドを中断します。
  2. このメッセージをウィンドウを所有するスレッドのキューに送ります。
  3. そのスレッドがGetMessage(またはそれに類するもの)を呼び出すと、メッセージがウィンドウに送出されます。
  4. 最後に、OSが呼び出し元スレッドを再開します。 SendMessageは、ウィンドウプロシージャによって返された結果を返します。

このような場合、発信者を間接的に識別しようとする場合があります。ブレークポイントでプログラムを中断し、SendMessageなどの呼び出しでブロックされた中断されたスレッドを検索しようとします。

最後に、投稿されたメッセージは上記の方法では追跡できません。 PostMessageの呼び出しに条件付きブレークポイントを設定しようとするかもしれませんが、呼び出し側が別の問題に属している場合は、より複雑になります。

0

ヴァルドが正しいです。 SendMessageへの呼び出しは、アプリケーションwndprocを直接呼び出します。 PostMessageを呼び出すとメッセージキューにメッセージがポストされ、アプリケーションはメッセージポンプを介してメッセージを受け取ります(ループ、getmessage、translatemessage、dispatchmessage)。つまり、メッセージがSendMessage経由で送信された場合、関数の呼び出し先がコールスタックに表示されます。それがPostMessage経由で送信された場合、それはされません。

+0

したがって、PostMessageをSendMessageのように動作させる方法はありませんか?もしそうなら、私が見る唯一の方法は、すべてのPostMessage呼び出しをSendMessageで一時的に置き換えることです。 – ks1322

+0

いいえ、Postmessageをsendmessageのように動作させる方法はありません。ポストメッセージは非同期で、メッセージをメッセージキューに送信します。メッセージを直接バイパスし、アプリケーションwndprocを直接呼び出します。 PostMessageを呼び出すとすぐに返されますが、呼び出しスレッドでsendmessageブロックが返されます。渡されたhwndのwndprocを呼び出してwndprocにアクセスします。 – johnathon

+0

この回答はシングルスレッドの場合にも当てはまります。 'SendMessage'は、あなたのスレッドではなく、スレッドのウィンドウのWindowProcを呼び出さなければならないので、スレッド間で違った働きをします。各スレッドには独自の呼び出しスタックがあるため、SendMessage呼び出しはWndProc呼び出しと同じスタックにはありません。 – MSalters

関連する問題