Freigeben über


PostThreadMessageW-Funktion (winuser.h)

Sendet eine Nachricht an die Nachrichtenwarteschlange des angegebenen Threads. Es wird zurückgegeben, ohne darauf zu warten, dass der Thread die Nachricht verarbeitet.

Syntax

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

Parameter

[in] idThread

Art: DWORD

Der Bezeichner des Threads, an den die Nachricht gesendet werden soll.

Die Funktion schlägt fehl, wenn der angegebene Thread keine Nachrichtenwarteschlange enthält. Das System erstellt die Nachrichtenwarteschlange eines Threads, wenn der Thread zum ersten Mal eine der Benutzer- oder GDI-Funktionen aufruft. Weitere Informationen finden Sie im Abschnitt mit Hinweisen.

Die Veröffentlichung von Nachrichten unterliegt UIPI. Der Thread eines Prozesses kann Nachrichten nur in Nachrichtenwarteschlangen von Threads in Prozessen mit geringerer oder gleicher Integritätsebene posten.

Dieser Thread muss über die SE_TCB_NAME Berechtigung verfügen, eine Nachricht an einen Thread zu senden, der zu einem Prozess mit demselben lokal eindeutigen Bezeichner (LUID) gehört, sich aber auf einem anderen Desktop befindet. Andernfalls schlägt die Funktion fehl und gibt ERROR_INVALID_THREAD_ID zurück.

Dieser Thread muss entweder zum selben Desktop wie der aufrufende Thread oder zu einem Prozess mit derselben LUID gehören. Andernfalls schlägt die Funktion fehl und gibt ERROR_INVALID_THREAD_ID zurück.

[in] Msg

Typ: UINT

Der Typ der zu postenden Nachricht.

[in] wParam

Typ: WPARAM

Zusätzliche meldungsspezifische Informationen.

[in] lParam

Typ: LPARAM

Zusätzliche meldungsspezifische Informationen.

Rückgabewert

Typ: BOOL

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich Null.

Wenn die Funktion fehlerhaft ist, ist der Rückgabewert null. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf. GetLastError gibt ERROR_INVALID_THREAD_ID zurück, wenn idThread kein gültiger Threadbezeichner ist oder wenn der von idThread angegebene Thread keine Nachrichtenwarteschlange aufweist. GetLastError gibt ERROR_NOT_ENOUGH_QUOTA zurück, wenn das Nachrichtenlimit erreicht wird.

Hinweise

Wenn eine Nachricht von UIPI blockiert wird, wird der letzte Fehler, der mit GetLastError abgerufen wird, auf 5 (Zugriff verweigert) festgelegt.

Der Thread, in dem die Nachricht gepostet wird, muss eine Nachrichtenwarteschlange erstellt haben, andernfalls schlägt der Aufruf von PostThreadMessage fehl. Verwenden Sie die folgende Methode, um diese Situation zu behandeln.

  • Erstellen Sie ein Ereignisobjekt, und erstellen Sie dann den Thread.
  • Verwenden Sie die WaitForSingleObject-Funktion , um zu warten, bis das Ereignis auf den signalierten Zustand festgelegt ist, bevor Sie PostThreadMessage aufrufen.
  • Rufen Sie in dem Thread, in den die Nachricht gesendet wird, PeekMessage auf, wie hier gezeigt, um das System zum Erstellen der Nachrichtenwarteschlange zu zwingen.

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

  • Legen Sie das Ereignis fest, um anzugeben, dass der Thread bereit ist, gepostete Nachrichten zu empfangen.
Der Thread, in dem die Nachricht gepostet wird, ruft die Nachricht ab, indem die GetMessage - oder PeekMessage-Funktion aufgerufen wird. Das hwnd-Element der zurückgegebenen MSG-Struktur ist NULL.

Von PostThreadMessage gepostete Nachrichten sind keinem Fenster zugeordnet. In der Regel können Nachrichten, die nicht einem Fenster zugeordnet sind, nicht von der DispatchMessage-Funktion gesendet werden. Wenn sich der Empfängerthread in einer modalen Schleife befindet (wie von MessageBox oder DialogBox verwendet), gehen die Nachrichten daher verloren. Um Threadnachrichten in einer modalen Schleife abzufangen, verwenden Sie einen threadspezifischen Hook.

Das System führt nur Marshalling für Systemmeldungen durch (solche im Bereich von 0 bis (WM_USER-1)). Um andere Nachrichten (diese >= WM_USER) an einen anderen Prozess zu senden, müssen Sie benutzerdefiniertes Marshalling durchführen.

Es gibt ein Limit von 10.000 gesendeten Nachrichten pro Nachrichtenwarteschlange. Dieser Grenzwert sollte ausreichend hoch sein. Wenn Ihre Anwendung den Grenzwert überschreitet, sollte sie neu gestaltet werden, um zu vermeiden, dass so viele Systemressourcen verbraucht werden. Um dieses Limit anzupassen, ändern Sie den folgenden Registrierungsschlüssel.

HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows NT
            CurrentVersion
               Windows
                  USERPostMessageLimit

Der zulässige Mindestwert ist 4000.

Hinweis

Der winuser.h-Header definiert PostThreadMessage als Alias, der die ANSI- oder Unicode-Version dieser Funktion basierend auf der Definition der UNICODE-Präprozessorkonstante automatisch auswählt. Das Mischen der Verwendung des codierungsneutralen Alias mit nicht codierungsneutralem Code kann zu Nichtübereinstimmungen führen, die zu Kompilierungs- oder Laufzeitfehlern führen. Weitere Informationen finden Sie unter Konventionen für Funktionsprototypen.

Anforderungen

   
Unterstützte Mindestversion (Client) Windows 2000 Professional [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows 2000 Server [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile winuser.h (einschließlich Windows.h)
Bibliothek User32.lib
DLL User32.dll
APIs ext-ms-win-ntuser-message-l1-1-0 (eingeführt in Windows 8)

Weitere Informationen

Konzept

GetCurrentThreadId

GetMessage

GetWindowThreadProcessId

MSG

Nachrichten und Nachrichtenwarteschlangen

Andere Ressourcen

PeekMessage

PostMessage

Referenz

Sleep

Waitforsingleobject