Der WH_KEYBOARD_LL-Hook, ein Low-Level-Tastatur-Hook, ermöglicht Ihnen dies um Tastatureingaben in einer WPF-Anwendung zu erfassen und zu verarbeiten. Einige Benutzer haben jedoch ein Problem gemeldet, bei dem der Hook nach einer gewissen Zeit der Tastenbetätigung nicht mehr funktioniert. Um dieses Problem zu lösen, untersuchen wir die zugrunde liegende Ursache und bieten eine Lösung an.
Das Problem entsteht durch ein Threading-Problem. Die Erstellung des Low-Level-Tastatur-Hook-Callback-Delegaten erfolgt inline innerhalb des SetHook-Methodenaufrufs. Leider ist dieser Delegat sofort für die Garbage Collection geeignet, da keine Referenz gepflegt wird. Sobald der Delegat erfasst wurde, werden keine Rückrufe mehr empfangen.
Um zu verhindern, dass der Delegat in die Garbage Collection gelangt, müssen wir einen Verweis darauf behalten, während der Hook aktiv ist. Dies kann erreicht werden, indem der Delegat in einem Feld oder einer Eigenschaft der Klasse gespeichert wird:
private HookCallback callback; ... public KeyboardListener() { callback = new HookCallback(HookCallbackInner); hookId = InterceptKeys.SetHook(callback); }
Durch die Zuweisung des Rückrufs zu einem Feld wird der Delegat für die Dauer der Existenz des Hooks am Leben gehalten. Dadurch wird sichergestellt, dass auch nach mehreren Tastenanschlägen weiterhin Rückrufe eingehen.
Um die Stabilität des Tastatur-Hooks weiter zu verbessern, beachten Sie die folgenden Empfehlungen:
Das obige ist der detaillierte Inhalt vonWarum funktioniert mein WPF-Hook WH_KEYBOARD_LL nach einigen Tastenanschlägen nicht mehr und wie kann ich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!