postThreadMessageA 函式 (winuser.h)
將訊息張貼至指定執行緒的訊息佇列。 它會傳回而不等待中的執行緒處理訊息。
語法
BOOL PostThreadMessageA(
[in] DWORD idThread,
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
);
參數
[in] idThread
類型: DWORD
要張貼訊息之執行緒的識別碼。
如果指定的執行緒沒有訊息佇列,則函式會失敗。 當執行緒第一次呼叫其中一個 User 或 GDI 函式時,系統會建立執行緒的訊息佇列。 如需詳細資訊,請參閱<備註>一節。
郵件張貼受限於 UIPI。 進程的執行緒只能將訊息張貼到執行緒的張貼訊息佇列中,進程較小於或等於完整性層級。
此執行緒必須具有 SE_TCB_NAME 許可權,才能將訊息張貼至屬於相同本機唯一識別碼的進程, (LUID) ,但位於不同的桌面上。 否則,函式會失敗並傳回 ERROR_INVALID_THREAD_ID。
此執行緒必須屬於與呼叫執行緒相同的桌面,或是屬於具有相同 LUID 的進程。 否則,函式會失敗並傳回 ERROR_INVALID_THREAD_ID。
[in] Msg
類型: UINT
要張貼的訊息類型。
[in] wParam
類型: WPARAM
其他特定訊息資訊。
[in] lParam
類型: LPARAM
其他特定訊息資訊。
傳回值
類型: BOOL
如果函式成功,則傳回非零的值。
如果此函式失敗,則傳回值為零。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。 如果idThread不是有效的執行緒識別碼,或者idThread指定的執行緒沒有訊息佇列,GetLastError會傳回ERROR_INVALID_THREAD_ID。 GetLastError 會在達到訊息限制時傳回 ERROR_NOT_ENOUGH_QUOTA 。
備註
當 UIPI 封鎖訊息時,使用 GetLastError擷取的最後一個錯誤會設定為 5 (拒絕存取) 。
張貼訊息的執行緒必須已建立訊息佇列,否則 PostThreadMessage 的呼叫會失敗。 使用下列方法來處理這種情況。
- 建立事件物件,然後建立執行緒。
- 使用 WaitForSingleObject 函式,先等候事件設定為訊號狀態,再呼叫 PostThreadMessage。
-
在將張貼訊息的執行緒中,呼叫 PeekMessage ,如下所示,強制系統建立訊息佇列。
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)
- 設定 事件,指出執行緒已準備好接收張貼的訊息。
PostThreadMessage所張貼的訊息不會與視窗相關聯。 一般規則是, DispatchMessage 函式無法分派未與視窗相關聯的訊息。 因此,如果收件者執行緒處於強制回應迴圈, (MessageBox 或 DialogBox) ,訊息將會遺失。 若要在強制回應迴圈中攔截執行緒訊息,請使用執行緒特定的攔截。
系統只會針對範圍 0 中的系統訊息 (封送處理,以 (WM_USER-1) ) 。 若要傳送其他訊息 (這些 > = WM_USER) 至另一個進程,您必須執行自訂封送處理。
每個訊息佇列有 10,000 則張貼的訊息限制。 此限制應該夠大。 如果您的應用程式超過限制,則應該重新設計,以避免耗用太多系統資源。 若要調整此限制,請修改下列登錄機碼。
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Windows USERPostMessageLimit
可接受的最小值為 4000。
注意
winuser.h 標頭會將 PostThreadMessage 定義為別名,根據 UNICODE 預處理器常數的定義,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程式碼,可能會導致編譯或執行時間錯誤不符。 如需詳細資訊,請參閱 函式原型的慣例。
規格需求
最低支援的用戶端 | Windows 2000 Professional [僅限傳統型應用程式] |
最低支援的伺服器 | Windows 2000 Server [僅限桌面應用程式] |
目標平台 | Windows |
標頭 | winuser.h (包含 Windows.h) |
程式庫 | User32.lib |
Dll | User32.dll |
API 集合 | ext-ms-win-ntuser-message-l1-1-0 (Windows 8) |
另請參閱
概念
其他資源
參考