6

GetMessage/DispatchMessageWPF アプリケーションの場合、(Windows の意味で)古典的なメッセージ ループが内部にありApplication.Runますか? PostThreadMessageを使用して別の Win32 アプリケーションからWPF UI スレッドに投稿されたメッセージ (HWND ハンドルのないメッセージ) をキャッチすることは可能ですか。ありがとうございました。

4

1 に答える 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 に答える