Skip to content

Commit ee68e57

Browse files
committed
封装 WinApi
1 parent 43d903a commit ee68e57

File tree

5 files changed

+115
-96
lines changed

5 files changed

+115
-96
lines changed

src/ComputerLock/Platforms/HotkeyHook.cs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System.Runtime.InteropServices;
2-
3-
namespace ComputerLock.Platforms;
1+
namespace ComputerLock.Platforms;
42

53
/// <summary>
64
/// 快捷键钩子
@@ -9,12 +7,6 @@ public class HotkeyHook : IDisposable
97
{
108
private List<int> ids = new List<int>();
119

12-
[DllImport("user32.dll")]
13-
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
14-
15-
[DllImport("user32.dll")]
16-
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
17-
1810
public event Action<int>? HotkeyPressed;
1911

2012
private sealed class HotkeyNativeWindow : NativeWindow
@@ -57,7 +49,7 @@ public void Register(int id, Hotkey hotKey)
5749
Unregister(id);
5850
}
5951

60-
var success = RegisterHotKey(_nativeWindow.Handle, id, (uint)hotKey.Modifiers, (uint)hotKey.Key);
52+
var success = WinApi.RegisterHotKey(_nativeWindow.Handle, id, (uint)hotKey.Modifiers, (uint)hotKey.Key);
6153
if (!success)
6254
{
6355
throw new Exception($"注册快捷键失败。id({id})");
@@ -71,7 +63,7 @@ public void Register(int id, Hotkey hotKey)
7163
/// </summary>
7264
public void Unregister(int id)
7365
{
74-
UnregisterHotKey(_nativeWindow.Handle, id);
66+
WinApi.UnregisterHotKey(_nativeWindow.Handle, id);
7567
}
7668

7769
public void Dispose()
Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,6 @@
1-
using System.Runtime.InteropServices;
2-
3-
namespace ComputerLock.Platforms;
1+
namespace ComputerLock.Platforms;
42
internal class MouseHook
53
{
6-
[DllImport("user32.dll")]
7-
private static extern int ShowCursor(bool bShow);
8-
9-
[DllImport("user32.dll")]
10-
private static extern int SetCursorPos(int x, int y);
11-
12-
[DllImport("user32.dll")]
13-
private static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
14-
15-
public const int MOUSEEVENTF_LEFTDOWN = 0x0002;
16-
public const int MOUSEEVENTF_LEFTUP = 0x0004;
17-
public const int MOUSEEVENTF_RIGHTDOWN = 0x0008;
18-
public const int MOUSEEVENTF_RIGHTUP = 0x0010;
19-
204
private int _cursorCount = 0;
215
private Random _random = new Random();
226

@@ -27,7 +11,7 @@ public void HideCursor()
2711
{
2812
if (_cursorCount >= 0) // 如果光标可见
2913
{
30-
_cursorCount = ShowCursor(false); // 隐藏光标
14+
_cursorCount = WinApi.ShowCursor(false); // 隐藏光标
3115
}
3216
}
3317

@@ -38,7 +22,7 @@ public void ShowCursor()
3822
{
3923
if (_cursorCount < 0) // 如果光标不可见
4024
{
41-
_cursorCount = ShowCursor(true); // 显示光标
25+
_cursorCount = WinApi.ShowCursor(true); // 显示光标
4226
}
4327
}
4428

@@ -49,13 +33,13 @@ public void ResetCursorState()
4933
{
5034
while (_cursorCount < 0) // 如果光标隐藏
5135
{
52-
ShowCursor(true); // 显示光标
36+
WinApi.ShowCursor(true); // 显示光标
5337
_cursorCount++;
5438
}
5539

5640
while (_cursorCount > 0) // 如果光标多次显示
5741
{
58-
ShowCursor(false); // 隐藏光标
42+
WinApi.ShowCursor(false); // 隐藏光标
5943
_cursorCount--;
6044
}
6145
}
@@ -69,7 +53,7 @@ public void MoveAndClick()
6953
var y = _random.Next(0, 100);
7054

7155
var p = new Point(x, y);
72-
SetCursorPos((int)p.X, (int)p.Y);
73-
mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, x, y, 0, 0);
56+
WinApi.SetCursorPos((int)p.X, (int)p.Y);
57+
WinApi.mouse_event(WinApi.MOUSEEVENTF_RIGHTDOWN | WinApi.MOUSEEVENTF_RIGHTUP, x, y, 0, 0);
7458
}
7559
}

src/ComputerLock/Platforms/SystemKeyHook.cs

Lines changed: 20 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,10 @@
44
namespace ComputerLock.Platforms;
55
internal class SystemKeyHook : IDisposable
66
{
7-
// ReSharper disable InconsistentNaming
8-
private const int WH_KEYBOARD_LL = 13;
9-
private const int WM_KEYDOWN = 0x0100;
10-
private const int WM_SYSKEYDOWN = 0x0104;
11-
12-
private const int VK_LWIN = 0x5B;
13-
private const int VK_RWIN = 0x5C;
14-
private const int VK_LSHIFT = 0xA0;
15-
private const int VK_RSHIFT = 0xA1;
16-
private const int VK_LCONTROL = 0xA2;
17-
private const int VK_RCONTROL = 0xA3;
18-
//ALT
19-
private const int VK_LMENU = 0xA4;
20-
private const int VK_RMENU = 0xA5;
21-
private const int VK_TAB = 0x09;
22-
// ReSharper restore InconsistentNaming
23-
247
private int _hookId;
25-
private readonly HookDelegate _hookCallback;
8+
private readonly WinApi.HookDelegate _hookCallback;
269
private Hotkey? _ignoreHotkey; // 使用单个Hotkey变量来存储需要忽略的快捷键
2710

28-
public delegate int HookDelegate(int nCode, int wParam, IntPtr lParam);
29-
30-
[DllImport("user32.dll")]
31-
public static extern int SetWindowsHookEx(int idHook, HookDelegate callback, IntPtr hInstance, uint threadId);
32-
33-
[DllImport("user32.dll")]
34-
public static extern int UnhookWindowsHookEx(int idHook);
35-
36-
[DllImport("user32.dll")]
37-
public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
38-
39-
[DllImport("kernel32.dll")]
40-
public static extern IntPtr GetModuleHandle(string lpModuleName);
41-
42-
4311
public SystemKeyHook()
4412
{
4513
_hookCallback = KeyboardHookCallback;
@@ -53,7 +21,7 @@ public void DisableSystemKey()
5321
{
5422
return;
5523
}
56-
_hookId = SetWindowsHookEx(WH_KEYBOARD_LL, _hookCallback, GetModuleHandle(moduleName), 0);
24+
_hookId = WinApi.SetWindowsHookEx(WinApi.WH_KEYBOARD_LL, _hookCallback, WinApi.GetModuleHandle(moduleName), 0);
5725
}
5826

5927
public void SetIgnoreHotkey(Hotkey hotKey)
@@ -68,11 +36,11 @@ private int KeyboardHookCallback(int nCode, int wParam, IntPtr lParam)
6836

6937
if (_ignoreHotkey == null)
7038
{
71-
if (IsSystemKey(vkCode) && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
39+
if (IsSystemKey(vkCode) && (wParam == WinApi.WM_KEYDOWN || wParam == WinApi.WM_SYSKEYDOWN))
7240
{
7341
return 1; // 阻止事件传递
7442
}
75-
return CallNextHookEx(_hookId, nCode, wParam, lParam); // 其他按键放行
43+
return WinApi.CallNextHookEx(_hookId, nCode, wParam, lParam); // 其他按键放行
7644
}
7745

7846
if (!IsPartOfIgnoreHotkey(vkCode))
@@ -86,35 +54,35 @@ private int KeyboardHookCallback(int nCode, int wParam, IntPtr lParam)
8654
return 1; // 阻止事件传递
8755
}
8856
}
89-
return CallNextHookEx(_hookId, nCode, wParam, lParam); // 放行
57+
return WinApi.CallNextHookEx(_hookId, nCode, wParam, lParam); // 放行
9058
}
91-
return CallNextHookEx(_hookId, nCode, wParam, lParam);
59+
return WinApi.CallNextHookEx(_hookId, nCode, wParam, lParam);
9260
}
9361

9462
private bool IsSystemKey(int vkCode)
9563
{
96-
return vkCode == VK_LWIN || vkCode == VK_RWIN ||
97-
vkCode == VK_LSHIFT || vkCode == VK_RSHIFT ||
98-
vkCode == VK_LCONTROL || vkCode == VK_RCONTROL ||
99-
vkCode == VK_TAB;
64+
return vkCode == WinApi.VK_LWIN || vkCode == WinApi.VK_RWIN ||
65+
vkCode == WinApi.VK_LSHIFT || vkCode == WinApi.VK_RSHIFT ||
66+
vkCode == WinApi.VK_LCONTROL || vkCode == WinApi.VK_RCONTROL ||
67+
vkCode == WinApi.VK_TAB;
10068
}
10169

10270
private bool IsPartOfIgnoreHotkey(int vkCode)
10371
{
10472
bool isPartOfIgnoreHotkey = false;
10573
if (_ignoreHotkey!.Modifiers.HasFlag(HotkeyModifiers.Control))
10674
{
107-
isPartOfIgnoreHotkey |= (vkCode == VK_LCONTROL || vkCode == VK_RCONTROL);
75+
isPartOfIgnoreHotkey |= (vkCode == WinApi.VK_LCONTROL || vkCode == WinApi.VK_RCONTROL);
10876
}
10977

11078
if (_ignoreHotkey.Modifiers.HasFlag(HotkeyModifiers.Shift))
11179
{
112-
isPartOfIgnoreHotkey |= (vkCode == VK_LSHIFT || vkCode == VK_RSHIFT);
80+
isPartOfIgnoreHotkey |= (vkCode == WinApi.VK_LSHIFT || vkCode == WinApi.VK_RSHIFT);
11381
}
11482

11583
if (_ignoreHotkey.Modifiers.HasFlag(HotkeyModifiers.Alt))
11684
{
117-
isPartOfIgnoreHotkey |= (vkCode == VK_LMENU || vkCode == VK_RMENU);
85+
isPartOfIgnoreHotkey |= (vkCode == WinApi.VK_LMENU || vkCode == WinApi.VK_RMENU);
11886
}
11987

12088
isPartOfIgnoreHotkey |= (vkCode == (int)_ignoreHotkey.Key);
@@ -123,22 +91,22 @@ private bool IsPartOfIgnoreHotkey(int vkCode)
12391

12492
private bool IsModifierKey(int vkCode)
12593
{
126-
return vkCode == VK_LCONTROL || vkCode == VK_RCONTROL ||
127-
vkCode == VK_LSHIFT || vkCode == VK_RSHIFT ||
128-
vkCode == VK_LMENU || vkCode == VK_RMENU;
94+
return vkCode == WinApi.VK_LCONTROL || vkCode == WinApi.VK_RCONTROL ||
95+
vkCode == WinApi.VK_LSHIFT || vkCode == WinApi.VK_RSHIFT ||
96+
vkCode == WinApi.VK_LMENU || vkCode == WinApi.VK_RMENU;
12997
}
13098

13199
private bool IsModifierRequired(int vkCode)
132100
{
133-
if (vkCode == VK_LCONTROL || vkCode == VK_RCONTROL)
101+
if (vkCode == WinApi.VK_LCONTROL || vkCode == WinApi.VK_RCONTROL)
134102
{
135103
return _ignoreHotkey!.Modifiers.HasFlag(HotkeyModifiers.Control);
136104
}
137-
if (vkCode == VK_LSHIFT || vkCode == VK_RSHIFT)
105+
if (vkCode == WinApi.VK_LSHIFT || vkCode == WinApi.VK_RSHIFT)
138106
{
139107
return _ignoreHotkey!.Modifiers.HasFlag(HotkeyModifiers.Shift);
140108
}
141-
if (vkCode == VK_LMENU || vkCode == VK_RMENU)
109+
if (vkCode == WinApi.VK_LMENU || vkCode == WinApi.VK_RMENU)
142110
{
143111
return _ignoreHotkey!.Modifiers.HasFlag(HotkeyModifiers.Alt);
144112
}
@@ -148,6 +116,6 @@ private bool IsModifierRequired(int vkCode)
148116
public void Dispose()
149117
{
150118
_ignoreHotkey = null;
151-
UnhookWindowsHookEx(_hookId);
119+
WinApi.UnhookWindowsHookEx(_hookId);
152120
}
153121
}

src/ComputerLock/Platforms/UserActivityMonitor.cs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,6 @@ namespace ComputerLock.Platforms;
66

77
public class UserActivityMonitor
88
{
9-
[DllImport("user32.dll")]
10-
private static extern bool GetLastInputInfo(ref LastInputInfo plii);
11-
struct LastInputInfo
12-
{
13-
public uint cbSize;
14-
public uint dwTime;
15-
}
16-
179
private Timer? _timer;
1810
public EventHandler? OnIdle;
1911
private int _autoLockMillisecond;
@@ -54,10 +46,10 @@ public void StopMonitoring()
5446

5547
private void Timer_Elapsed(object? sender, ElapsedEventArgs e)
5648
{
57-
var lastInputInfo = new LastInputInfo();
49+
var lastInputInfo = new WinApi.LastInputInfo();
5850
lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
5951

60-
if (GetLastInputInfo(ref lastInputInfo))
52+
if (WinApi.GetLastInputInfo(ref lastInputInfo))
6153
{
6254
long elapsedMillisecond = (long)Environment.TickCount64 - lastInputInfo.dwTime;
6355
if (elapsedMillisecond > _autoLockMillisecond)
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
using System.Runtime.InteropServices;
2+
3+
namespace ComputerLock.Platforms;
4+
5+
/// <summary>
6+
/// Windows API 封装
7+
/// </summary>
8+
internal static class WinApi
9+
{
10+
#region 热键相关
11+
12+
[DllImport("user32.dll")]
13+
public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
14+
15+
[DllImport("user32.dll")]
16+
public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
17+
18+
#endregion
19+
20+
#region 鼠标相关
21+
22+
public const int MOUSEEVENTF_LEFTDOWN = 0x0002;
23+
public const int MOUSEEVENTF_LEFTUP = 0x0004;
24+
public const int MOUSEEVENTF_RIGHTDOWN = 0x0008;
25+
public const int MOUSEEVENTF_RIGHTUP = 0x0010;
26+
27+
[DllImport("user32.dll")]
28+
public static extern int ShowCursor(bool bShow);
29+
30+
[DllImport("user32.dll")]
31+
public static extern int SetCursorPos(int x, int y);
32+
33+
[DllImport("user32.dll")]
34+
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
35+
36+
#endregion
37+
38+
#region 键盘相关
39+
40+
public const int WH_KEYBOARD_LL = 13;
41+
public const int WM_KEYDOWN = 0x0100;
42+
public const int WM_SYSKEYDOWN = 0x0104;
43+
44+
public const int VK_LWIN = 0x5B;
45+
public const int VK_RWIN = 0x5C;
46+
public const int VK_LSHIFT = 0xA0;
47+
public const int VK_RSHIFT = 0xA1;
48+
public const int VK_LCONTROL = 0xA2;
49+
public const int VK_RCONTROL = 0xA3;
50+
//ALT
51+
public const int VK_LMENU = 0xA4;
52+
public const int VK_RMENU = 0xA5;
53+
public const int VK_TAB = 0x09;
54+
55+
public delegate int HookDelegate(int nCode, int wParam, IntPtr lParam);
56+
57+
[DllImport("user32.dll")]
58+
public static extern int SetWindowsHookEx(int idHook, HookDelegate callback, IntPtr hInstance, uint threadId);
59+
60+
[DllImport("user32.dll")]
61+
public static extern int UnhookWindowsHookEx(int idHook);
62+
63+
[DllImport("user32.dll")]
64+
public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);
65+
66+
[DllImport("kernel32.dll")]
67+
public static extern IntPtr GetModuleHandle(string lpModuleName);
68+
69+
#endregion
70+
71+
#region 系统空闲相关
72+
73+
public struct LastInputInfo
74+
{
75+
public uint cbSize;
76+
public uint dwTime;
77+
}
78+
79+
[DllImport("user32.dll")]
80+
public static extern bool GetLastInputInfo(ref LastInputInfo plii);
81+
82+
#endregion
83+
}

0 commit comments

Comments
 (0)