Freigeben über


IME stürzt beim Verarbeiten einer aus einem anderen Thread gesendeten Fensternachricht ab

Beschreibt ein Szenario, in dem ein Eingabemethoden-Editor (INPUT Method Editor, IME) abstürzt, während eine von einem anderen Thread gesendete Fensternachricht verarbeitet wird und in dem die Fensterprozedur die Nachricht verarbeitet, zImmSetOpenStatus. B. eine Imm* Funktion aufruft.

Problembeschreibung

Eine Anwendung mit einem IME stürzt unter einer der folgenden Bedingungen ab:

  • Ein Benutzeroberflächenthread ruft die TranslateMessage Funktion als Teil der Nachrichtenschleife auf.
  • Ein anderer Thread sendet eine Fensternachricht an ein Fenster im Besitz des UI-Threads.
  • Die Fensterprozedur, die die vom anderen Thread gesendete Fensternachricht verarbeitet, ruft eine Imm* Funktion auf, z ImmSetOpenStatus. B. .

Ursache

Ein in Windows 10 enthaltener IME kann die PeekMessage Funktion aufrufen, wenn der IME von der TranslateMessage Funktion aufgerufen wird, um eine Tastatureingabe zu verarbeiten. PeekMessage verarbeitet alle ausstehenden Fenstermeldungen, die von anderen Threads gesendet werden. Dies kann zu einem Reentrancy-Problem führen, wenn die Fensterprozedur, die die gesendete Nachricht verarbeitet, eine Imm* Funktion aufruft und den IME in einem unerwarteten Zustand verlässt.

Problemumgehung

Vermeiden Sie das Aufrufen von Imm* Funktionen, während der IME eine andere Fenstermeldung verarbeitet.

Weitere Informationen

Die PeekMessage Dokumentation enthält Folgendes:

Während dieses Aufrufs liefert das System ausstehende und nicht in die Warteschlange eingereihte Nachrichten, die an Fenster gesendet werden, die im Besitz des aufrufenden Threads sind, mit der SendMessage, SendMessageCallback, SendMessageTimeoutoder SendNotifyMessage Funktion. Die erste Nachricht in der Warteschlange, die dem angegebenen Filter entspricht, wird abgerufen. Das System kann auch interne Ereignisse verarbeiten. Wenn kein Filter angegeben ist, werden Nachrichten in dieser Reihenfolge verarbeitet:

  • Gesendete Nachrichten
  • Gepostete Nachrichten
  • Eingabemeldungen (Hardware) und interne Systemereignisse
  • Gesendete Nachrichten (erneut)
  • WM_PAINT Nachrichten
  • WM_TIMER Nachrichten

Notiz

Gesendete Fensternachrichten sind nicht in die Warteschlange eingereihte Nachrichten. Der beim Aufrufen des PeekMessage-Anrufs angegebene Nachrichtenfilter gilt nicht für gesendete Nachrichten.