對於WPF應用程序,是否有內部經典消息循環(在Windows的GetMessage/DispatchMessage
意義上),在Application.Run
裏面?是否有可能捕獲從PostThreadMessage到另一個Win32應用程序發佈到WPF UI線程(沒有HWND句柄的消息)的消息。謝謝。WPF應用程序消息循環和PostThreadMessage
6
A
回答
3
我使用了.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
並觀看您感興趣的消息。
相關問題
- 1. wpf方法啓動應用程序消息循環
- 2. WPF應用程序消息框
- 3. 在Windows窗體應用程序中掛鉤消息循環?
- 4. 獲取外部應用程序的消息循環
- 5. win32應用程序是否有一個消息循環?或者它是每個窗口一個消息循環?
- 6. 的ShowWindow和消息循環
- 7. Windows消息循環和WTL
- 8. 使用sigc和glib的win32應用程序如何實現消息循環
- 9. 窗口程序中的消息循環是否總是「循環」?
- 10. 消息循環如何使用線程?
- 11. .net消息循環
- 12. Erlang消息循環
- 13. Windows消息循環
- 14. 消息應用程序與node.js和socket.io
- 15. Android應用程序循環
- 16. MFC消息泵vs Win32消息循環
- 17. WPF應用程序調用API,它需要消息泵
- 18. 多線程Win32 GUI消息循環
- 19. 僅用於消息循環的WPF窗口句柄
- 20. WTL 8.0 _模塊和消息循環
- 21. MIME和處理反饋循環消息
- 22. 將消息發佈到Cocoa應用程序的主事件循環?
- 23. 代碼不能從GTK應用程序退出 - 顯然沒有消息循環
- 24. 從外部應用程序連接子窗口時的消息循環(泵)
- 25. WPF應用程序中的模態消息框
- 26. 從WPF應用程序發送消息到Azure隊列
- 27. WPF應用程序和WPF瀏覽器應用程序
- 28. 的Windows消息循環和服務器循環
- 29. PHP IMAP INBOX消息循環
- 30. LIFO Win32消息循環?
使用[ComponentDispatcher.ThreadFilterMessage](http://msdn.microsoft.com/zh-cn/library/system.windows.interop.component library).threadfiltermessage.aspx)事件可能會注意到特定的消息,儘管文檔說它是用於鍵盤消息的。這是一個相關的問題[回答](http://stackoverflow.com/questions/476084/c-sharp-twain-interaction)。 – Noseratio