PostThreadMessageA-Funktion (winuser.h)
Sendet eine Nachricht in der Nachrichtenwarteschlange des angegebenen Threads. Es wird zurückgegeben, ohne darauf zu warten, dass der Thread die Nachricht verarbeitet.
Syntax
BOOL PostThreadMessageA(
[in] DWORD idThread,
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
);
Parameter
[in] idThread
Typ: DWORD-
Der Bezeichner des Threads, in den die Nachricht gepostet 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 den ersten Aufruf einer der Benutzer- oder GDI-Funktionen vorgibt. Weitere Informationen finden Sie im Abschnitt "Hinweise".
Die Veröffentlichung von Nachrichten unterliegt UIPI. Der Thread eines Prozesses kann Nachrichten nur in geposteten 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 in einem Thread zu veröffentlichen, der zu einem Prozess mit demselben lokal eindeutigen Bezeichner (LUID) gehört, sich aber in einem anderen Desktop befindet. Andernfalls schlägt die Funktion fehl und gibt ERROR_INVALID_THREAD_IDzurück.
Dieser Thread muss entweder zum gleichen 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_IDzurück.
[in] Msg
Typ: UINT-
Der Typ der nachricht, die gepostet werden soll.
[in] wParam
Typ: WPARAM-
Zusätzliche nachrichtenspezifische Informationen.
[in] lParam
Typ: LPARAM-
Zusätzliche nachrichtenspezifische Informationen.
Rückgabewert
Typ: BOOL-
Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich Null.
Wenn die Funktion fehlschlägt, ist der Rückgabewert null. Rufen Sie GetLastErrorauf, um erweiterte Fehlerinformationen zu erhalten. GetLastError- gibt ERROR_INVALID_THREAD_ID zurück, wenn idThread- kein gültiger Threadbezeichner ist oder wenn der durch idThread- angegebene Thread keine Nachrichtenwarteschlange aufweist. GetLastError- gibt ERROR_NOT_ENOUGH_QUOTA zurück, wenn der Nachrichtengrenzwert erreicht wird.
Bemerkungen
Wenn eine Nachricht vom UIPI blockiert wird, wird der letzte Fehler mit GetLastErrorabgerufen, auf 5 festgelegt (Zugriff verweigert).
Der Thread, in den die Nachricht gepostet wird, muss eine Nachrichtenwarteschlange erstellt haben, oder andernfalls schlägt der Aufruf von PostThread Message 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 wird, bevor PostThreadMessageaufgerufen wird.
-
Rufen Sie im Thread, in dem die Nachricht gepostet wird, PeekMessage- an, wie hier gezeigt, um das System zu erzwingen, die Nachrichtenwarteschlange zu erstellen.
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.
Nachrichten, die von PostThreadMessage- gepostet wurden, sind keinem Fenster zugeordnet. Im Allgemeinen können Nachrichten, die keinem Fenster zugeordnet sind, nicht von der DispatchMessage--Funktion verteilt werden. Wenn sich der Empfängerthread daher in einer modalen Schleife befindet (wie von MessageBox oder DialogBox-verwendet), gehen die Nachrichten verloren. Verwenden Sie einen threadspezifischen Hook, um Threadnachrichten während einer modalen Schleife abzufangen.
Das System marshallt nur für Systemmeldungen (die im Bereich 0 bis (WM_USER-1)). Um andere Nachrichten (die >= WM_USER) an einen anderen Prozess zu senden, müssen Sie benutzerdefinierte Marshalling durchführen.
Es gibt eine Beschränkung von 10.000 geposteten Nachrichten pro Nachrichtenwarteschlange. Dieser Grenzwert sollte ausreichend groß sein. Wenn Ihre Anwendung den Grenzwert überschreitet, sollte sie neu gestaltet werden, um zu vermeiden, dass so viele Systemressourcen verbraucht werden. Um diesen Grenzwert anzupassen, ändern Sie den folgenden Registrierungsschlüssel.
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Windows USERPostMessageLimit
Der mindest zulässige Wert ist 4000.
Anmerkung
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 Code, der nicht codierungsneutral ist, kann zu Nichtübereinstimmungen führen, die zu Kompilierungs- oder Laufzeitfehlern führen. Weitere Informationen finden Sie unter Konventionen für Funktionsprototypen.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Windows 2000 Professional [nur Desktop-Apps] |
mindestens unterstützte Server- | Windows 2000 Server [nur Desktop-Apps] |
Zielplattform- | Fenster |
Header- | winuser.h (enthalten Windows.h) |
Library | User32.lib |
DLL- | User32.dll |
API-Satz | ext-ms-win-ntuser-message-l1-1-0 (eingeführt in Windows 8) |
Siehe auch
Konzeptionelle
Nachrichten- und Nachrichtenwarteschlangen
andere Ressourcen
Referenz-