Freigeben über


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.
Der Thread, in den die Nachricht gepostet wird, ruft die Nachricht ab, indem die GetMessage-- oder PeekMessage- funktion aufgerufen wird. Das Element der zurückgegebenen MSG--Struktur ist NULL-.

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

GetCurrentThreadId-

GetMessage-

GetWindowThreadProcessId-

MSG-

Nachrichten- und Nachrichtenwarteschlangen

andere Ressourcen

PeekMessage-

PostMessage-

Referenz-

Sleep

WaitForSingleObject