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_IDGetLastError 會在達到訊息限制時傳回 ERROR_NOT_ENOUGH_QUOTA

備註

當 UIPI 封鎖訊息時,使用 GetLastError擷取的最後一個錯誤會設定為 5 (拒絕存取) 。

張貼訊息的執行緒必須已建立訊息佇列,否則 PostThreadMessage 的呼叫會失敗。 使用下列方法來處理這種情況。

  • 建立事件物件,然後建立執行緒。
  • 使用 WaitForSingleObject 函式,先等候事件設定為訊號狀態,再呼叫 PostThreadMessage
  • 在將張貼訊息的執行緒中,呼叫 PeekMessage ,如下所示,強制系統建立訊息佇列。

    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)

  • 設定 事件,指出執行緒已準備好接收張貼的訊息。
訊息所張貼的執行緒會藉由呼叫 GetMessagePeekMessage 函式來擷取訊息。 傳回之 MSG結構的hwnd成員為Null

PostThreadMessage所張貼的訊息不會與視窗相關聯。 一般規則是, DispatchMessage 函式無法分派未與視窗相關聯的訊息。 因此,如果收件者執行緒處於強制回應迴圈, (MessageBoxDialogBox) ,訊息將會遺失。 若要在強制回應迴圈中攔截執行緒訊息,請使用執行緒特定的攔截。

系統只會針對範圍 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)

另請參閱

概念

GetCurrentThreadId

GetMessage

GetWindowThreadProcessId

味精

訊息和訊息佇列

其他資源

PeekMessage

PostMessage

參考

Sleep

WaitForSingleObject