次の方法で共有


PostThreadMessageW 関数 (winuser.h)

指定したスレッドのメッセージ キューにメッセージを投稿します。 スレッドがメッセージを処理するのを待たずに返されます。

構文

BOOL PostThreadMessageW(
  [in] DWORD  idThread,
  [in] UINT   Msg,
  [in] WPARAM wParam,
  [in] LPARAM lParam
);

パラメーター

[in] idThread

型: DWORD

メッセージが投稿されるスレッドの識別子。

指定したスレッドにメッセージ キューがない場合、関数は失敗します。 システムは、スレッドがユーザー関数または GDI 関数のいずれかを最初に呼び出すときに、スレッドのメッセージ キューを作成します。 詳細については、「解説」セクションを参照してください。

メッセージの投稿は UIPI の対象となります。 プロセスのスレッドは、整合性レベルが低いか等しいプロセス内のスレッドのポストされたメッセージ キューにのみメッセージを投稿できます。

このスレッドには、同じローカル一意識別子 (LUID) を持つプロセスに属しているが、別のデスクトップにあるスレッドにメッセージを投稿するための SE_TCB_NAME 特権が必要です。 それ以外の場合、関数は失敗し、ERROR_INVALID_THREAD_IDを返します。

このスレッドは、呼び出し元スレッドと同じデスクトップに属しているか、同じ LUID を持つプロセスに属している必要があります。 それ以外の場合、関数は失敗し、ERROR_INVALID_THREAD_IDを返します。

[in] Msg

型: UINT

投稿するメッセージの種類。

[in] wParam

型: WPARAM

追加のメッセージ固有の情報。

[in] lParam

型: LPARAM

追加のメッセージ固有の情報。

戻り値

型: BOOL

関数が成功した場合、戻り値は 0 以外です。

関数が失敗した場合、戻り値は 0 です。 拡張エラー情報を取得するには、GetLastError呼び出します。 idThread が有効なスレッド識別子でない場合、または idThread で指定されたスレッドにメッセージ キューがない場合、GetLastErrorERROR_INVALID_THREAD_ID を返します。 GetLastError は、メッセージの制限に達したときに ERROR_NOT_ENOUGH_QUOTA を返します。

備考

メッセージが UIPI によってブロックされると、GetLastErrorで取得された最後のエラー 5 (アクセス拒否) に設定されます。

メッセージの送信先のスレッドがメッセージ キューを作成している必要があります。そうしないと、PostThreadMessage 呼び出しが失敗します。 この状況を処理するには、次のメソッドを使用します。

  • イベント オブジェクトを作成し、スレッドを作成します。
  • WaitForSingleObject 関数を使用して、PostThreadMessageを呼び出す前 イベントがシグナル状態に設定されるのを待機します。
  • メッセージが投稿されるスレッドで、ここに示すように PeekMessage 呼び出して、システムにメッセージ キューの作成を強制します。

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

  • イベントを設定して、スレッドが投稿されたメッセージを受信する準備ができていることを示します。
メッセージがポストされるスレッドは、GetMessage または PeekMessage 関数を呼び出してメッセージ 取得します。 返された MSG 構造体の hwnd メンバーが NULL

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 ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして PostThreadMessage を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント 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 の