WPF 应用程序消息循环和 PostThreadMessage

Posted

技术标签:

【中文标题】WPF 应用程序消息循环和 PostThreadMessage【英文标题】:WPF application message loop and PostThreadMessage 【发布时间】:2013-08-13 12:25:34 【问题描述】:

对于 WPF 应用程序,在 Application.Run 内部是否存在经典消息循环(在 Windows 的 GetMessage/DispatchMessage 意义上)?是否可以使用PostThreadMessage 捕获从另一个 Win32 应用程序发布到 WPF UI 线程的消息(没有 HWND 句柄的消息)。谢谢。

【问题讨论】:

可能可以通过ComponentDispatcher.ThreadFilterMessage 事件来监视特定消息,尽管文档说它是用于键盘消息的。这是一个相关的问题answered。 【参考方案1】:

我使用 .NET Reflector 将 Applicaton.Run 实现跟踪到 Dispatcher.PushFrameImpl。也可以从.NET Framework reference sources 获得相同的信息。确实有一个经典的消息循环:

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 的实现,它确实会在RaiseThreadMessage 内部的执行过程中触发ComponentDispatcher.ThreadFilterMessage 事件:

private void TranslateAndDispatchMessage(ref MSG msg)

    if (!ComponentDispatcher.RaiseThreadMessage(ref msg))
    
        UnsafeNativeMethods.TranslateMessage(ref msg);
        UnsafeNativeMethods.DispatchMessage(ref msg);
    

显然,它适用于任何已发布的消息,而不仅仅是键盘消息。您应该可以订阅ComponentDispatcher.ThreadFilterMessage 并关注您感兴趣的消息。

【讨论】:

以上是关于WPF 应用程序消息循环和 PostThreadMessage的主要内容,如果未能解决你的问题,请参考以下文章

WPF的usercontrol中如何使用消息循环,就是DefWndProc

WPF与WinForm

WPF 内部的5个窗口之 MediaContextNotificationWindow

是否可以看到 WPF 崩溃的错误消息? [复制]

我可以在 WPF 应用程序中使用 Lync 2013 SDK 或 API 发送即时消息和呼叫吗?

WPF 渲染原理