使用VB.NET/C# - .Net Framework 3.5。我目前處於WinForms事件的處理程序中(例如)。在處理程序中,我希望將自己的事件放入窗口消息泵中,但在隊列末尾(假設它泵送消息FIFO)。我希望我的處理程序和任何其他處理程序能夠執行當前事件,並且隨後拿起我插入隊列並調用處理程序的自定義事件。關於如何將事件插入Windows事件隊列(不關心什麼語言)的示例代碼?如何將事件添加到Windows消息泵隊列中?
回答
如果你想添加一條消息到隊列中,那麼你只需要P/Invoke PostMessage
function。正如文檔所述,此功能:
在與創建指定窗口的線程關聯的消息隊列中放置消息,並返回而無需等待線程處理消息。
樣品的P/Invoke聲明:
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32", SetLastError = true)]
static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
hWnd
是一個句柄到你的窗口,其窗口過程應該接收消息的一個。在WinForms中,這可以使用Handle
屬性進行檢索。msg
是您要發佈的訊息。當然,你需要弄清楚在這裏使用哪一個。如果其中一條標準信息適用於您的目的,那麼您可以使用它。否則,只需定義一個用戶定義的消息。用戶定義的消息的值範圍> =WM_USER
。所以:const uint WM_USER = 0x0400; const uint UWM_MYGREATMESSAGE = WM_USER + 1; const uint UWM_MYOTHERMESSAGE = WM_USER + 2;
顯然,
wParam
和lParam
包含特定消息的信息。如果您使用的是標準消息之一,他們的文檔將告訴您在這裏指定的內容。如果您使用用戶定義的消息,那麼您幾乎可以通過任何您想要的東西,包括IntPtr.Zero
,如果您不需要任何自定義數據。
@CodyGray的+1在長時間缺席後回到SO。現在我有人要再次戰鬥:P –
這是不必要的複雜的程序。目前已經建成張貼到消息隊列框架多種工具,也沒有必要程序複雜化,減少維修,或在這裏明確地使用非託管代碼增加了出錯的機會。 – Servy
@Servy我知道這是一個古老的問題,但這個答案對我很有用。如果你知道一種方法來實現沒有PostMessage的延遲UI線程執行,你能否創建一個答案?請注意'Control.Invoke'是不夠的(它同步運行)...也許'BeginInvoke'會工作,但它不是顯然是正確的。 –
我真的很喜歡@CodyGray給出的工程示例。 自從我在Delphi中使用Win32的東西已經有一段時間了:)。
儘管如此,我仍然無法保持我的手指,並不得不分享這個想法,因爲我認爲這可能會更簡單。
假設您有一段代碼。我們稱之爲A。 假設它由10條語句組成。我們稱它們爲a0至a9。 因此,我們的代碼塊看起來是這樣的:
{
a0;
a1;
...
a4;
a5;
...
a8;
a9;
}
現在說你寫出來這個塊作爲一個Windows事件處理程序窗體控件:
void button1_Click(object sender, EventArgs e) {
a0;
a1;
...
a8;
a9;
}
突然你意識到你想立即執行a0至a4,並延遲執行a5至a9。後來的意思是儘快但消息泵閒置後。
所有你需要做的是:
void button1_Click(object sender, EventArgs e) {
a0;
a1;
a2;
a3;
a4;
this.BeginInvoke(() => {
a5;
a6;
a7;
a8;
a9;
});
}
的
- 1. Windows Azure腳本服務將消息添加到隊列中
- 2. GUI消息隊列(消息泵 - 並行或串行)
- 3. 添加消息時觸發天青消息隊列事件嗎?我如何訂閱?這個事件?
- 4. 將消息隊列中的消息從Windows Server 2003複製到Windows Server 2012
- 5. .NET中的消息泵Windows服務
- 6. 無限循環中的Windows消息泵
- 7. 消息隊列Windows服務
- 8. 如何使用rabbitMQ將消息發送到消息隊列?
- 9. 添加到消息隊列中,如果有更重要的消息進來
- 10. 將消息從SQL添加到Azure服務總線隊列
- 11. Azure無法將消息添加到隊列
- 12. Android:將事件發佈到View的消息隊列
- 13. 如何添加支持參數的自定義消息泵?
- 14. 如何在pygame的事件隊列中添加按鍵事件
- 15. Microsoft消息隊列ReceiveCompleted事件
- 16. 如何在C#中將隊列添加到隊列<T>?
- 17. DLL中的Windows消息隊列處理
- 18. 如何使用PHP將附件添加到郵件消息中?
- 19. 將消息添加到消息數組
- 20. 如何將消息發佈到運行消息泵的STA線程?
- 21. 如何在Javascript事件隊列中添加消息? (取消長時間運行的方法)
- 22. 將消息還原到隊列
- 23. 如何將msmq消息移動到子隊列中
- 24. C#隊列 - 如何將結構添加到每個隊列點
- 25. 如何在MQRabbit隊列的末尾添加消息
- 26. Azure:如何將消息從毒隊列移回主隊列?
- 27. 將文件拖入消息隊列
- 28. 如何使用EWS將附件添加到嵌入消息中
- 29. 如何將消息添加到AVD的收件箱中
- 30. Java - 將消息添加到收件箱
可能重複[?如何更新從C#另一個線程的GUI(http://stackoverflow.com/questions/661561/how-to-更新-gui-from-another-thread-in-c) – Servy
@Servy我不明白這是如何重複的? – Stijn
這是如何重複? – Denis