WPF/C#에서 전역 키보드 후크(WH_KEYBOARD_LL) 사용
일정 기간 후 키보드 리스너가 작동을 멈추는 문제를 해결하려면 시간이 지나면 문제의 원인을 이해하는 것이 중요합니다. 문제의 근본 원인은 SetHook 메서드 내에서 콜백 대리자가 생성되고 사용되는 방식에 있습니다.
다음 코드 조각은 문제를 보여줍니다.
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); } }
이 코드에서 콜백은 대리자는 SetHook 메서드 호출 내에서 인라인으로 생성되고 proc 매개 변수에 할당됩니다. 그러나 이 대리자는 클래스나 인스턴스 내의 다른 변수나 속성에 할당되지 않습니다. 즉, 가비지 수집을 방지하는 참조가 없습니다.
대리자가 가비지 수집되면 함수 포인터 SetWindowsHookEx에 전달된 값이 유효하지 않게 되고 콜백을 더 이상 호출할 수 없습니다. 이것이 잠시 후 리스너가 작동을 멈추는 이유입니다.
이 문제를 해결하려면 후크가 있는 동안 대리자에 대한 참조를 활성 상태로 유지해야 합니다. 이는 클래스나 인스턴스 내의 필드나 속성에 대리자를 할당하여 수행할 수 있습니다. 예를 들면 다음과 같습니다.
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); } }
_proc 필드에 대리자를 할당하면 SetHook 메서드가 호출되는 동안 대리자가 활성 상태로 유지됩니다. 이렇게 하면 가비지 수집기가 대리자를 수집하는 것을 방지하고 콜백이 계속 호출되도록 할 수 있습니다.
위 내용은 내 WPF C# 전역 키보드 후크가 작동을 멈추는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!