PostMessageA-Funktion (winuser.h)
Places 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.
Um eine Nachricht in der Nachrichtenwarteschlange zu posten, die einem Thread zugeordnet ist, verwenden Sie die PostThreadMessage-Funktion .
Syntax
BOOL PostMessageA(
[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 empfangen soll. Die folgenden Werte haben eine besondere Bedeutung.
Wert | Bedeutung |
---|---|
|
Die Meldung wird an alle Fenster der obersten Ebene im System gesendet, einschließlich deaktivierter oder unsichtbarer nicht vorhandener Fenster, überlappender Fenster und Popupfenster. Die Nachricht wird nicht an untergeordnete Fenster gesendet. |
|
Die Funktion verhält sich wie ein Aufruf von PostThreadMessage , wobei der dwThreadId-Parameter auf den Bezeichner des aktuellen Threads festgelegt ist. |
Ab Windows Vista unterliegt die Veröffentlichung von Nachrichten der 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 zu postende Nachricht.
Listen der vom System bereitgestellten Nachrichten finden Sie unter Systemdefinierte Nachrichten.
[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.
Hinweise
Wenn eine Nachricht von UIPI blockiert wird, wird der letzte Fehler, der mit GetLastError abgerufen wurde, auf 5 (Zugriff verweigert) festgelegt.
Nachrichten in einer Nachrichtenwarteschlange werden durch Aufrufe der GetMessage - oder PeekMessage-Funktion abgerufen.
Anwendungen, die mit HWND_BROADCAST kommunizieren müssen, sollten die RegisterWindowMessage-Funktion verwenden, um eine eindeutige Nachricht für die anwendungsübergreifende Kommunikation zu erhalten.
Das System führt nur Marshalling für Systemmeldungen durch (die 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.
Wenn Sie eine Nachricht im folgenden Bereich WM_USER an die asynchronen Nachrichtenfunktionen (PostMessage, SendNotifyMessage und SendMessageCallback) senden, 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 Nachricht verarbeiten kann, und der Absender gibt den Speicher frei, bevor er verwendet wird.
Posten Sie die WM_QUIT Nachricht nicht mithilfe von PostMessage. verwenden Sie die PostQuitMessage-Funktion .
Eine Barrierefreiheitsanwendung kann PostMessage verwenden, um WM_APPCOMMAND Nachrichten in der Shell zu veröffentlichen, um Anwendungen zu starten. Diese Funktionalität funktioniert nicht garantiert für andere Arten von Anwendungen.
Eine Nachrichtenwarteschlange kann höchstens 10.000 Nachrichten enthalten. 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 zu erhalten. GetLastError gibt ERROR_NOT_ENOUGH_QUOTA zurück, wenn der Grenzwert erreicht wird.
Der zulässige Mindestwert ist 4000.
Beispiele
Im folgenden Beispiel wird gezeigt, wie Sie mithilfe der PostMessage-Funktion eine private Fensternachricht posten. Angenommen, Sie haben eine private Fenstermeldung namens WM_COMPLETE definiert:
#define WM_COMPLETE (WM_USER + 0)
Sie können eine Nachricht in der Nachrichtenwarteschlange posten, die dem Thread zugeordnet ist, der das angegebene Fenster erstellt hat, wie unten gezeigt:
WaitForSingleObject (pparams->hEvent, INFINITE) ;
lTime = GetCurrentTime () ;
PostMessage (pparams->hwnd, WM_COMPLETE, 0, lTime);
Weitere Beispiele finden Sie unter Initiieren eines Datenlinks.
Hinweis
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 |
---|---|
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 (windows.h einschließen) |
Bibliothek | User32.lib |
DLL | User32.dll |
APIs | ext-ms-win-ntuser-message-l1-1-0 (eingeführt in Windows 8) |
Siehe auch
Konzept
Nachrichten und Nachrichtenwarteschlangen
Referenz