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。
言論
當 UIPI 封鎖訊息時,使用 getLastError擷取
張貼訊息的線程必須已建立消息佇列,否則呼叫 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 [僅限傳統型應用程式] |
目標平臺 | 窗戶 |
標頭 | winuser.h (包括 Windows.h) |
連結庫 | User32.lib |
DLL | User32.dll |
API 集 | ext-ms-win-ntuser-message-l1-1-0 (在 Windows 8 中引進) |
另請參閱
概念
其他資源
參考