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.
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
Nachrichten und Nachrichtenwarteschlangen
Andere Ressourcen
Referenz