@@ -6,7 +6,7 @@ namespace ComputerLock.Platforms;
66/// </summary>
77internal class SystemKeyHook : WindowsInputHook
88{
9- private Hotkey ? _ignoreHotkey ; // 使用单个Hotkey变量来存储需要忽略的快捷键
9+ private Hotkey ? _ignoreHotkey ; // 使用单个Hotkey变量来存储需要忽略的快捷键
1010
1111 protected override int HookType => WinApi . WH_KEYBOARD_LL ;
1212
@@ -19,98 +19,73 @@ public void SetIgnoreHotkey(Hotkey? hotKey)
1919
2020 protected override int HookCallback ( int nCode , int wParam , IntPtr lParam )
2121 {
22- if ( nCode >= 0 )
22+ if ( nCode < 0 || ! ( wParam == WinApi . WM_KEYDOWN || wParam == WinApi . WM_SYSKEYDOWN ) )
2323 {
24- int vkCode = Marshal . ReadInt32 ( lParam ) ;
24+ return WinApi . CallNextHookEx ( _hookId , nCode , wParam , lParam ) ;
25+ }
2526
26- // 仅在按下阶段进行拦截判断;抬起阶段放行避免影响 WM_HOTKEY 触发
27- if ( ! ( wParam == WinApi . WM_KEYDOWN || wParam == WinApi . WM_SYSKEYDOWN ) )
28- {
29- return WinApi . CallNextHookEx ( _hookId , nCode , wParam , lParam ) ;
30- }
27+ int vkCode = Marshal . ReadInt32 ( lParam ) ;
3128
32- if ( _ignoreHotkey == null )
33- {
34- if ( IsSystemKey ( vkCode ) )
35- {
36- OnUserInput ? . Invoke ( this , EventArgs . Empty ) ;
37- return 1 ; // 阻止事件传递
38- }
39- return WinApi . CallNextHookEx ( _hookId , nCode , wParam , lParam ) ; // 其他按键放行
40- }
41-
42- // 属于需要放行的热键组成部分(修饰键或主键)则放行
43- if ( IsPartOfIgnoreHotkey ( vkCode ) )
29+ if ( _ignoreHotkey == null )
30+ {
31+ if ( IsBlockedSystemKey ( vkCode ) )
4432 {
45- return WinApi . CallNextHookEx ( _hookId , nCode , wParam , lParam ) ;
33+ OnUserInput ? . Invoke ( this , EventArgs . Empty ) ;
34+ return 1 ;
4635 }
4736
48- // 拦截非必要修饰键
49- if ( IsModifierKey ( vkCode ) && ! IsModifierRequired ( vkCode ) )
50- {
51- return 1 ; // 阻止事件传递
52- }
37+ return WinApi . CallNextHookEx ( _hookId , nCode , wParam , lParam ) ;
38+ }
5339
54- // 不是忽略热键
55- if ( vkCode != ( int ) _ignoreHotkey . Key )
56- {
57- return 1 ; // 阻止事件传递
58- }
40+ if ( IsPartOfIgnoreHotkey ( vkCode ) )
41+ {
42+ return WinApi . CallNextHookEx ( _hookId , nCode , wParam , lParam ) ;
5943 }
60- return WinApi . CallNextHookEx ( _hookId , nCode , wParam , lParam ) ;
61- }
6244
63- private bool IsSystemKey ( int vkCode )
64- {
65- return vkCode == WinApi . VK_LWIN || vkCode == WinApi . VK_RWIN ||
66- vkCode == WinApi . VK_LSHIFT || vkCode == WinApi . VK_RSHIFT ||
67- vkCode == WinApi . VK_LCONTROL || vkCode == WinApi . VK_RCONTROL ||
68- vkCode == WinApi . VK_TAB ;
45+ OnUserInput ? . Invoke ( this , EventArgs . Empty ) ;
46+ return 1 ;
6947 }
7048
49+ #region 快捷键辅助方法
50+
7151 private bool IsPartOfIgnoreHotkey ( int vkCode )
7252 {
73- bool isPartOfIgnoreHotkey = false ;
53+ bool isPart = false ;
54+
7455 if ( _ignoreHotkey ! . Modifiers . HasFlag ( HotkeyModifiers . Control ) )
7556 {
76- isPartOfIgnoreHotkey |= ( vkCode == WinApi . VK_LCONTROL || vkCode == WinApi . VK_RCONTROL ) ;
57+ isPart |= ( vkCode == WinApi . VK_LCONTROL || vkCode == WinApi . VK_RCONTROL ) ;
7758 }
7859
7960 if ( _ignoreHotkey . Modifiers . HasFlag ( HotkeyModifiers . Shift ) )
8061 {
81- isPartOfIgnoreHotkey |= ( vkCode == WinApi . VK_LSHIFT || vkCode == WinApi . VK_RSHIFT ) ;
62+ isPart |= ( vkCode == WinApi . VK_LSHIFT || vkCode == WinApi . VK_RSHIFT ) ;
8263 }
8364
8465 if ( _ignoreHotkey . Modifiers . HasFlag ( HotkeyModifiers . Alt ) )
8566 {
86- isPartOfIgnoreHotkey |= ( vkCode == WinApi . VK_LMENU || vkCode == WinApi . VK_RMENU ) ;
67+ isPart |= ( vkCode == WinApi . VK_LMENU || vkCode == WinApi . VK_RMENU ) ;
8768 }
8869
89- isPartOfIgnoreHotkey |= ( vkCode == ( int ) _ignoreHotkey . Key ) ;
90- return isPartOfIgnoreHotkey ;
91- }
70+ isPart |= ( vkCode == ( int ) _ignoreHotkey . Key ) ;
9271
93- private bool IsModifierKey ( int vkCode )
94- {
95- return vkCode == WinApi . VK_LCONTROL || vkCode == WinApi . VK_RCONTROL ||
96- vkCode == WinApi . VK_LSHIFT || vkCode == WinApi . VK_RSHIFT ||
97- vkCode == WinApi . VK_LMENU || vkCode == WinApi . VK_RMENU ;
72+ return isPart ;
9873 }
9974
100- private bool IsModifierRequired ( int vkCode )
75+ #endregion
76+
77+ #region 密码解锁辅助方法
78+
79+ /// <summary>
80+ /// 拦截单独的系统键
81+ /// </summary>
82+ private bool IsBlockedSystemKey ( int vkCode )
10183 {
102- if ( vkCode == WinApi . VK_LCONTROL || vkCode == WinApi . VK_RCONTROL )
103- {
104- return _ignoreHotkey ! . Modifiers . HasFlag ( HotkeyModifiers . Control ) ;
105- }
106- if ( vkCode == WinApi . VK_LSHIFT || vkCode == WinApi . VK_RSHIFT )
107- {
108- return _ignoreHotkey ! . Modifiers . HasFlag ( HotkeyModifiers . Shift ) ;
109- }
110- if ( vkCode == WinApi . VK_LMENU || vkCode == WinApi . VK_RMENU )
111- {
112- return _ignoreHotkey ! . Modifiers . HasFlag ( HotkeyModifiers . Alt ) ;
113- }
114- return false ;
84+ return vkCode == WinApi . VK_LWIN || vkCode == WinApi . VK_RWIN || // Win键
85+ vkCode == WinApi . VK_LCONTROL || vkCode == WinApi . VK_RCONTROL || // Ctrl
86+ vkCode == WinApi . VK_LSHIFT || vkCode == WinApi . VK_RSHIFT || // Shift
87+ vkCode == WinApi . VK_LMENU || vkCode == WinApi . VK_RMENU || // Alt
88+ vkCode == WinApi . VK_TAB ; // Tab
11589 }
116- }
90+ #endregion
91+ }
0 commit comments