Heim >Backend-Entwicklung >C++ >Warum funktioniert mein WPF C# Global Keyboard Hook nicht mehr und wie kann ich das Problem beheben?
Verwendung des globalen Tastatur-Hooks (WH_KEYBOARD_LL) in WPF / C#
Um das Problem zu beheben, dass der Tastatur-Listener nach einer gewissen Zeit nicht mehr funktioniert Zeit ist es wichtig, die Ursache des Problems zu verstehen. Die Ursache des Problems liegt in der Art und Weise, wie der Callback-Delegat innerhalb der SetHook-Methode erstellt und verwendet wird.
Der folgende Codeausschnitt veranschaulicht das Problem:
public static IntPtr SetHook(LowLevelKeyboardProc proc) { using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } }
In diesem Code der Callback Der Delegate wird inline innerhalb des SetHook-Methodenaufrufs erstellt und dem proc-Parameter zugewiesen. Dieser Delegat ist jedoch keiner anderen Variablen oder Eigenschaft innerhalb der Klasse oder Instanz zugewiesen, d die an SetWindowsHookEx übergeben wurde, wird ungültig und der Rückruf kann nicht mehr aufgerufen werden. Aus diesem Grund funktioniert der Listener nach einer Weile nicht mehr.
Um dieses Problem zu beheben, ist es notwendig, einen Verweis auf den Delegaten aufrechtzuerhalten, solange der Hook vorhanden ist. Dies kann erreicht werden, indem der Delegat einem Feld oder einer Eigenschaft innerhalb der Klasse oder Instanz zugewiesen wird. Zum Beispiel:
Durch die Zuweisung des Delegaten zum Feld _proc stellen wir sicher, dass er so lange am Leben bleibt, wie die SetHook-Methode aufgerufen wird. Dadurch wird verhindert, dass der Garbage Collector den Delegaten abholt, und sichergestellt, dass der Rückruf weiterhin aufgerufen wird.private static LowLevelKeyboardProc _proc; public static IntPtr SetHook(LowLevelKeyboardProc proc) { _proc = proc; using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, _proc, GetModuleHandle(curModule.ModuleName), 0); } }
Das obige ist der detaillierte Inhalt vonWarum funktioniert mein WPF C# Global Keyboard Hook nicht mehr und wie kann ich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!