Freigeben über


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
HWND_BROADCAST
((HWND)0xffff)
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.
NULL
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

GetMessage

Nachrichten und Nachrichtenwarteschlangen

PeekMessage

PostQuitMessage

PostThreadMessage

Referenz

RegisterWindowMessage

SendMessageCallback

SendNotifyMessage