@@ -23,28 +23,39 @@ protected override int HookCallback(int nCode, int wParam, IntPtr lParam)
2323 {
2424 int vkCode = Marshal . ReadInt32 ( lParam ) ;
2525
26+ // 仅在按下阶段进行拦截判断;抬起阶段放行避免影响 WM_HOTKEY 触发
27+ if ( ! ( wParam == WinApi . WM_KEYDOWN || wParam == WinApi . WM_SYSKEYDOWN ) )
28+ {
29+ return WinApi . CallNextHookEx ( _hookId , nCode , wParam , lParam ) ;
30+ }
31+
2632 if ( _ignoreHotkey == null )
2733 {
28- if ( IsSystemKey ( vkCode ) && ( wParam == WinApi . WM_KEYDOWN || wParam == WinApi . WM_SYSKEYDOWN ) )
34+ if ( IsSystemKey ( vkCode ) )
2935 {
3036 OnUserInput ? . Invoke ( this , EventArgs . Empty ) ;
3137 return 1 ; // 阻止事件传递
3238 }
3339 return WinApi . CallNextHookEx ( _hookId , nCode , wParam , lParam ) ; // 其他按键放行
3440 }
3541
36- if ( ! IsPartOfIgnoreHotkey ( vkCode ) )
42+ // 属于需要放行的热键组成部分(修饰键或主键)则放行
43+ if ( IsPartOfIgnoreHotkey ( vkCode ) )
3744 {
38- if ( IsModifierKey ( vkCode ) && ! IsModifierRequired ( vkCode ) )
39- {
40- return 1 ; // 阻止事件传递
41- }
42- else if ( vkCode != ( int ) _ignoreHotkey . Key )
43- {
44- return 1 ; // 阻止事件传递
45- }
45+ return WinApi . CallNextHookEx ( _hookId , nCode , wParam , lParam ) ;
46+ }
47+
48+ // 拦截非必要修饰键
49+ if ( IsModifierKey ( vkCode ) && ! IsModifierRequired ( vkCode ) )
50+ {
51+ return 1 ; // 阻止事件传递
52+ }
53+
54+ // 不是忽略热键
55+ if ( vkCode != ( int ) _ignoreHotkey . Key )
56+ {
57+ return 1 ; // 阻止事件传递
4658 }
47- return WinApi . CallNextHookEx ( _hookId , nCode , wParam , lParam ) ; // 放行
4859 }
4960 return WinApi . CallNextHookEx ( _hookId , nCode , wParam , lParam ) ;
5061 }
0 commit comments