GetMessage/DispatchMessage
WPF アプリケーションの場合、(Windows の意味で)古典的なメッセージ ループが内部にありApplication.Run
ますか? PostThreadMessageを使用して別の Win32 アプリケーションからWPF UI スレッドに投稿されたメッセージ (HWND ハンドルのないメッセージ) をキャッチすることは可能ですか。ありがとうございました。
質問する
3446 次
1 に答える
4
Applicaton.Run
.NET Reflector を使用して、.NET までの実装を追跡しましたDispatcher.PushFrameImpl
。.NET Framework のリファレンス ソースから同じ情報を取得することもできます。確かに古典的なメッセージ ループがあります。
private void PushFrameImpl(DispatcherFrame frame)
{
SynchronizationContext syncContext = null;
SynchronizationContext current = null;
MSG msg = new MSG();
this._frameDepth++;
try
{
current = SynchronizationContext.Current;
syncContext = new DispatcherSynchronizationContext(this);
SynchronizationContext.SetSynchronizationContext(syncContext);
try
{
while (frame.Continue)
{
if (!this.GetMessage(ref msg, IntPtr.Zero, 0, 0))
{
break;
}
this.TranslateAndDispatchMessage(ref msg);
}
if ((this._frameDepth == 1) && this._hasShutdownStarted)
{
this.ShutdownImpl();
}
}
finally
{
SynchronizationContext.SetSynchronizationContext(current);
}
}
finally
{
this._frameDepth--;
if (this._frameDepth == 0)
{
this._exitAllFrames = false;
}
}
}
さらに、 の実装は次のとおりですTranslateAndDispatchMessage
。これは実際に、内での実行過程に沿ってComponentDispatcher.ThreadFilterMessageイベントを発生させます。RaiseThreadMessage
private void TranslateAndDispatchMessage(ref MSG msg)
{
if (!ComponentDispatcher.RaiseThreadMessage(ref msg))
{
UnsafeNativeMethods.TranslateMessage(ref msg);
UnsafeNativeMethods.DispatchMessage(ref msg);
}
}
どうやら、キーボードのメッセージだけでなく、投稿されたメッセージに対しても機能するようです。ComponentDispatcher.ThreadFilterMessage
購読して、関心のあるメッセージを監視できるはずです。
于 2013-08-12T09:41:41.483 に答える