PostMessageW-Funktion (winuser.h)
Platziert (postet) eine Nachricht in der Nachrichtenwarteschlange, die dem Thread zugeordnet ist, der das angegebene Fenster erstellt hat, und gibt zurück, ohne darauf zu warten, dass der Thread die Nachricht verarbeitet.
Verwenden Sie die PostThreadMessage--Funktion, um eine Nachricht in der Nachrichtenwarteschlange zu veröffentlichen, die einem Thread zugeordnet ist.
Syntax
BOOL PostMessageW(
[in, optional] HWND hWnd,
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
);
Parameter
[in, optional] hWnd
Typ: HWND-
Ein Handle für das Fenster, dessen Fensterprozedur die Nachricht empfängt. Die folgenden Werte haben besondere Bedeutungen.
Wert | Bedeutung |
---|---|
|
Die Nachricht wird in allen Fenstern der obersten Ebene im System gepostet, einschließlich deaktivierter oder unsichtbarer nicht verworrener Fenster, überlappenden Fenstern und Popupfenstern. Die Nachricht wird nicht in untergeordnete Fenster gepostet. |
|
Die Funktion verhält sich wie ein Aufruf von PostThreadMessage-, wobei die dwThreadId Parameter auf den Bezeichner des aktuellen Threads festgelegt ist. |
Ab Windows Vista unterliegt die Veröffentlichung von Nachrichten UIPI. Der Thread eines Prozesses kann Nachrichten nur in Nachrichtenwarteschlangen von Threads in Prozessen mit geringerer oder gleicher Integritätsebene posten.
[in] Msg
Typ: UINT-
Die nachricht, die gepostet werden soll.
Listen der vom System bereitgestellten Nachrichten finden Sie unter System-Defined Nachrichten.
[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.
Bemerkungen
Wenn eine Nachricht vom UIPI blockiert wird, wird der letzte Fehler mit GetLastErrorabgerufen, auf 5 festgelegt (Zugriff verweigert).
Nachrichten in einer Nachrichtenwarteschlange werden durch Aufrufe der GetMessage- oder PeekMessage- funktion abgerufen.
Anwendungen, die mithilfe von HWND_BROADCAST kommunizieren müssen, sollten die RegisterWindowMessage--Funktion verwenden, um eine eindeutige Nachricht für die Kommunikation zwischen Anwendungen zu erhalten.
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.
Wenn Sie eine Nachricht im folgenden Bereich WM_USER an die asynchronen Nachrichtenfunktionen senden (PostMessage, SendNotifyMessageund SendMessageCallback), können die zugehörigen Nachrichtenparameter keine Zeiger enthalten. Andernfalls schlägt der Vorgang fehl. Die Funktionen werden zurückgegeben, bevor der empfangende Thread die Möglichkeit hatte, die Nachricht zu verarbeiten, und der Absender gibt den Speicher frei, bevor er verwendet wird.
Posten Sie die WM_QUIT Nachricht nicht mithilfe PostMessage-; verwenden Sie die funktion PostQuitMessage.
Eine Barrierefreiheitsanwendung kann PostMessage- verwenden, um WM_APPCOMMAND Nachrichten in der Shell zu veröffentlichen, um Anwendungen zu starten. Diese Funktionalität ist nicht garantiert für andere Anwendungstypen geeignet.
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
Wenn die Funktion fehlschlägt, rufen Sie GetLastError- auf, um erweiterte Fehlerinformationen abzurufen. GetLastError- gibt ERROR_NOT_ENOUGH_QUOTA zurück, wenn der Grenzwert erreicht wird.
Der mindest zulässige Wert ist 4000.
Beispiele
Das folgende Beispiel zeigt, wie Sie eine private Fensternachricht mithilfe der PostMessage--Funktion posten. Angenommen, Sie haben eine private Fensternachricht namens WM_COMPLETEdefiniert:
#define WM_COMPLETE (WM_USER + 0)
Sie können eine Nachricht in der Nachrichtenwarteschlange veröffentlichen, die dem Thread zugeordnet ist, der das angegebene Fenster erstellt hat, wie unten dargestellt:
WaitForSingleObject (pparams->hEvent, INFINITE) ;
lTime = GetCurrentTime () ;
PostMessage (pparams->hwnd, WM_COMPLETE, 0, lTime);
Weitere Beispiele finden Sie unter Initiieren eines Datenlinks.
Anmerkung
Der winuser.h-Header definiert PostMessage 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
Referenz-