共用方式為


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 [僅限傳統型應用程式]
目標平臺 窗戶
標頭 winuser.h (包括 Windows.h)
連結庫 User32.lib
DLL User32.dll
API 集 ext-ms-win-ntuser-message-l1-1-0 (在 Windows 8 中引進)

另請參閱

概念

GetCurrentThreadId

GetMessage

GetWindowThreadProcessId

MSG

訊息和消息佇列

其他資源

PeekMessage

PostMessage

參考

睡眠

WaitForSingleObject