WPF应用程序消息循环和PostThreadMessage

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

Solutions Collecting From Web of "WPF应用程序消息循环和PostThreadMessage"

我使用了.NET Reflector来跟踪Applicaton.Run实现,直到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的实现,它确实在RaiseThreadMessage内部执行了它的ComponentDispatcher.ThreadFilterMessage事件。

 private void TranslateAndDispatchMessage(ref MSG msg) { if (!ComponentDispatcher.RaiseThreadMessage(ref msg)) { UnsafeNativeMethods.TranslateMessage(ref msg); UnsafeNativeMethods.DispatchMessage(ref msg); } } 

显然,它适用于任何发布的消息,而不仅仅是键盘。 您应该能够订阅ComponentDispatcher.ThreadFilterMessage并观察您感兴趣的消息。