Skip to content

Commit e556e5a

Browse files
author
zd
committed
#37 优化屏幕锁定时按键拦截机制
1 parent 1ad19d8 commit e556e5a

File tree

1 file changed

+41
-66
lines changed

1 file changed

+41
-66
lines changed

src/ComputerLock/Platforms/SystemKeyHook.cs

Lines changed: 41 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace ComputerLock.Platforms;
66
/// </summary>
77
internal 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

Comments
 (0)