Message Queue Reference
A version of this page is also available for
4/8/2010
This language reference section contains descriptions of message queue programming elements.
Remarks
Message Queuing uses memory-mapped files to hold queued messages. There is no upper limit; the queue is of infinite size (constrained by system memory). The files are each a fixed size of 4 MB, which is also the size limit of a Message Queuing message. The driver (Mqac.sys) maps the files to kernel memory address space when Message Queuing runtime sends or receives a message.
See Also
PostMessageA 函數 (winuser.h)
將 (帖子) 消息隊列中與創建指定窗口的線程關聯的消息,並在不等待線程處理消息的情況下返回。
若要在與線程關聯的消息隊列中發佈消息,請使用 PostThreadMessage 函數。
語法
BOOL PostMessageA(
[in, optional] HWND hWnd,
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
);
參數
[in, optional] hWnd
類型:HWND
窗口過程接收消息的窗口的句柄。 以下值具有特殊含義。
Value | 含義 |
---|---|
|
消息將發佈到系統中的所有頂級窗口,包括已禁用或不可見的未擁有窗口、重疊的窗口和彈出窗口。 消息不會發布到子窗口。 |
|
該函數的行爲類似於對 PostThreadMessage 的調用, 其中 dwThreadId 參數設置爲當前線程的標識符。 |
從 Windows Vista 開始,消息發佈受 UIPI 的約束。 進程的線程只能將消息發佈到小於或等於完整性級別的進程中線程的消息隊列。
[in] Msg
類型: UINT
要發佈的消息。
有關係統提供的消息的列表,請參閱 系統定義的消息。
[in] wParam
類型: WPARAM
其他的消息特定信息。
[in] lParam
類型: LPARAM
其他的消息特定信息。
返回值
類型: BOOL
如果該函數成功,則返回值爲非零值。
如果函數失敗,則返回值爲零。 要獲得更多的錯誤信息,請調用 GetLastError。 GetLastError 在達到限制時返回 ERROR_NOT_ENOUGH_QUOTA 。
註解
當 UIPI 阻止消息時,使用 GetLastError 檢索到的最後一個錯誤設置爲 5 (拒絕訪問) 。
消息隊列中的消息通過調用 GetMessage 或 PeekMessage 函數來檢索。
需要使用 HWND_BROADCAST 進行通信的應用程序應使用 RegisterWindowMessage 函數獲取應用程序間通信的唯一消息。
系統僅對範圍 0 到 (WM_USER-1) ) 中的系統 (消息進行封送。 若要將其他消息 (= >WM_USER) 發送到另一個進程,必須執行自定義封送。
如果將以下範圍內的消息發送到 WM_USER 異步消息函數, (PostMessage、 SendNotifyMessage 和 SendMessageCallback) ,則其消息參數不能包含指針。 否則,操作會失敗。 在接收線程有機會處理消息之前,函數將返回,發送方在使用該消息之前釋放內存。
不要使用 PostMessage 發佈WM_QUIT消息;使用 PostQuitMessage 函數。
輔助功能應用程序可以使用 PostMessage 將 WM_APPCOMMAND 消息發佈到 shell 以啓動應用程序。 無法保證此功能適用於其他類型的應用程序。
消息隊列最多可以包含 10,000 條消息。 此限制應足夠大。
如果應用程序超出限制,則應重新設計它以避免消耗這麼多系統資源,若要調整此限制,請修改以下注冊表項。
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Windows USERPostMessageLimit
最小值爲 4000。
示例
以下示例演示如何使用 PostMessage 函數發佈專用窗口消息。 假設你定義了名爲 WM_COMPLETE的專用窗口消息:
#define WM_COMPLETE (WM_USER + 0)
可以將消息發佈到與創建指定窗口的線程關聯的消息隊列,如下所示:
WaitForSingleObject (pparams->hEvent, INFINITE) ;
lTime = GetCurrentTime () ;
PostMessage (pparams->hwnd, WM_COMPLETE, 0, lTime);