Skip to content

Commit 741f5e5

Browse files
committed
重构:明确和细化 Locke 和 LockService 的职责
1 parent 9a3176a commit 741f5e5

File tree

4 files changed

+179
-154
lines changed

4 files changed

+179
-154
lines changed
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
namespace ComputerLock.Platforms;
22

3-
public interface ILocker
3+
/// <summary>
4+
/// 锁定器接口,全局锁定:包括鼠标、键盘、任务管理器、系统快捷键等
5+
/// </summary>
6+
public interface ILocker : IDisposable
47
{
58
void Lock();
6-
event EventHandler OnLock;
7-
event EventHandler OnUnlock;
89
}
Lines changed: 103 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,117 @@
1-
namespace ComputerLock.Platforms;
1+
using Microsoft.Win32;
22

3+
namespace ComputerLock.Platforms;
4+
5+
/// <summary>
6+
/// 锁定器,全局锁定:包括鼠标、键盘、任务管理器、系统快捷键等
7+
/// </summary>
38
internal class Locker : ILocker
49
{
10+
private readonly ILogger _logger;
11+
private readonly AppSettings _appSettings;
512
private readonly LockService _lockService;
6-
public event EventHandler OnLock;
7-
public event EventHandler OnUnlock;
13+
private UserActivityMonitor? _activityMonitor;
14+
private readonly HotKeyHook _hotKeyHook;
15+
private readonly TaskManagerHook _taskManagerHook;
16+
private readonly MouseHook _mouseHook;
17+
private readonly SystemKeyHook _systemKeyHook;
818

9-
public Locker(LockService lockService)
19+
public Locker(ILogger logger, AppSettings appSettings, UserActivityMonitor activityMonitor, LockService lockService, HotKeyHook hotKeyHook, TaskManagerHook taskManagerHook, MouseHook mouseHook, SystemKeyHook systemKeyHook)
1020
{
21+
_logger = logger;
22+
_appSettings = appSettings;
1123
_lockService = lockService;
12-
_lockService.OnLock += (sender, e) => OnLock?.Invoke(sender, e);
13-
_lockService.OnUnlock += (sender, e) => OnUnlock?.Invoke(sender, e);
24+
_lockService.OnUnlock += (_, _) => OnUnlock();
25+
26+
InitActivityMonitor(activityMonitor);
27+
_hotKeyHook = hotKeyHook;
28+
_taskManagerHook = taskManagerHook;
29+
30+
// 防止锁屏时系统崩溃、重启等问题导致任务栏被禁用
31+
// 启动时默认启用一次
32+
// TODO 这里需要重新设计,不应该在这里启用任务管理器,因为有可能任务管理器是被其他程序主动禁用的
33+
_taskManagerHook.EnabledTaskManager();
34+
_mouseHook = mouseHook;
35+
_systemKeyHook = systemKeyHook;
36+
}
37+
38+
/// <summary>
39+
/// 初始化空闲检测
40+
/// </summary>
41+
private void InitActivityMonitor(UserActivityMonitor userActivityMonitor)
42+
{
43+
if (_appSettings.AutoLockSecond <= 0)
44+
{
45+
return;
46+
}
47+
_activityMonitor = userActivityMonitor;
48+
49+
_logger.Write("自动锁定已生效");
50+
_activityMonitor.Init(_appSettings.AutoLockSecond);
51+
_activityMonitor.OnIdle += (_, _) =>
52+
{
53+
_logger.Write("自动锁定 -> 锁定");
54+
Lock();
55+
};
56+
_logger.Write("自动锁定 -> 启动空闲检测");
57+
_activityMonitor.StartMonitoring();
58+
59+
_logger.Write("自动锁定 -> 准备监控系统会话状态");
60+
SystemEvents.SessionSwitch += (_, e) =>
61+
{
62+
if (e.Reason == SessionSwitchReason.SessionLock)
63+
{
64+
_logger.Write("Windows系统锁定 -> 暂停空闲检测");
65+
_activityMonitor.StopMonitoring();
66+
}
67+
else if (e.Reason == SessionSwitchReason.SessionUnlock)
68+
{
69+
_logger.Write("Windows系统解锁 -> 启动空闲检测");
70+
_activityMonitor.StartMonitoring();
71+
}
72+
};
1473
}
1574

1675
public void Lock()
1776
{
1877
_lockService.Lock();
78+
79+
_logger.Write("自动锁定 -> 暂停空闲检测");
80+
_activityMonitor?.StopMonitoring();
81+
82+
_logger.Write("锁定服务 -> 禁用任务管理器和系统键");
83+
_taskManagerHook.DisabledTaskManager();
84+
85+
if (_appSettings.IsHideMouseCursor)
86+
{
87+
_logger.Write("锁定服务 -> 隐藏鼠标光标");
88+
_mouseHook.HideCursor();
89+
}
90+
91+
_systemKeyHook.DisableSystemKey();
92+
}
93+
94+
95+
private void OnUnlock()
96+
{
97+
_logger.Write("自动锁定 -> 启动空闲检测");
98+
_activityMonitor?.StartMonitoring();
99+
100+
_logger.Write("锁定服务 -> 恢复任务管理器和系统键");
101+
_taskManagerHook.EnabledTaskManager();
102+
103+
if (_appSettings.IsHideMouseCursor)
104+
{
105+
_logger.Write("锁定服务 -> 恢复鼠标光标");
106+
_mouseHook.ResetCursorState();
107+
}
108+
109+
_systemKeyHook.Dispose();
110+
}
111+
112+
public void Dispose()
113+
{
114+
_hotKeyHook.Dispose();
115+
_activityMonitor?.Dispose();
19116
}
20117
}
Lines changed: 69 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,79 @@
11
using Microsoft.Extensions.DependencyInjection;
22
using System.Windows;
33
using System.Windows.Threading;
4+
using Application = System.Windows.Application;
45

56
namespace ComputerLock.Services;
6-
internal class LockService
7+
8+
/// <summary>
9+
/// 负责屏幕窗口的锁定和解锁
10+
/// </summary>
11+
internal class LockService(
12+
IServiceProvider serviceProvider,
13+
IStringLocalizer<Lang> lang,
14+
AppSettings appSettings,
15+
ILogger logger)
716
{
8-
private bool _isLocked = false;
9-
private readonly IServiceProvider _serviceProvider;
10-
private readonly SystemKeyHook _systemKeyHook;
17+
private bool _isLocked;
18+
1119
private WindowLockScreen? _windowLockScreen;
1220
private readonly List<WindowBlankScreen> _blankScreens = [];
13-
private readonly IStringLocalizer<Lang> _lang;
14-
private readonly AppSettings _appSettings;
15-
private readonly ILogger _logger;
16-
private readonly TaskManagerHook _taskManagerHook;
17-
private readonly MouseHook _mouseHook;
18-
public event EventHandler? OnLock;
1921
public event EventHandler? OnUnlock;
20-
public LockService(IServiceProvider serviceProvider, SystemKeyHook systemKeyHook, IStringLocalizer<Lang> lang, AppSettings appSettings, ILogger logger, TaskManagerHook taskManagerHook, MouseHook mouseHook)
21-
{
22-
_serviceProvider = serviceProvider;
23-
_systemKeyHook = systemKeyHook;
24-
_lang = lang;
25-
_appSettings = appSettings;
26-
_logger = logger;
27-
_taskManagerHook = taskManagerHook;
28-
_mouseHook = mouseHook;
29-
30-
// 防止锁屏时系统崩溃、重启等问题导致任务栏被禁用
31-
// 启动时默认启用一次
32-
_taskManagerHook.EnabledTaskManager();
33-
}
3422

3523
public void Lock()
3624
{
37-
_logger.Write("锁定服务 -> 准备锁定");
25+
logger.Write("锁定服务 -> 准备锁定");
3826
if (_isLocked)
3927
{
4028
return;
4129
}
42-
_logger.Write("锁定服务 -> 允许锁定");
30+
logger.Write("锁定服务 -> 允许锁定");
4331
var primaryScreen = Screen.PrimaryScreen;
4432
if (primaryScreen == null)
4533
{
46-
_logger.Write("锁定服务 -> 没有检测到屏幕");
34+
logger.Write("锁定服务 -> 没有检测到屏幕");
4735
throw new Exception("没有检测到屏幕 no screen");
4836
}
4937

5038
_isLocked = true;
51-
if (_appSettings.LockAnimation)
39+
if (appSettings.LockAnimation)
5240
{
53-
_logger.Write("锁定服务 -> 锁定动画");
54-
ShowPopup(_lang["Locked"]);
41+
logger.Write("锁定服务 -> 锁定动画");
42+
ShowPopup(lang["Locked"]);
5543
}
5644

57-
_logger.Write("锁定服务 -> 禁用任务管理器和系统键");
58-
_taskManagerHook.DisabledTaskManager();
59-
_systemKeyHook.DisableSystemKey();
6045
if (_blankScreens.Count > 0)
6146
{
6247
_blankScreens.Clear();
6348
}
6449

65-
_logger.Write("锁定服务 -> 准备主屏幕");
66-
_windowLockScreen = _serviceProvider.GetRequiredService<WindowLockScreen>();
67-
_windowLockScreen.OnUnlock += FmLockScreen_OnUnlock;
68-
_windowLockScreen.Closing += (_, _) =>
69-
{
70-
_windowLockScreen.OnUnlock -= FmLockScreen_OnUnlock;
71-
};
72-
ShowWindowOnScreen(_windowLockScreen, primaryScreen);
73-
74-
_logger.Write("锁定服务 -> 激活主屏幕");
75-
for (var i = 0; i <= Screen.AllScreens.Length - 1; i++)
50+
logger.Write("锁定服务 -> 准备主屏幕");
51+
Application.Current.Dispatcher.Invoke(() =>
7652
{
77-
var screen = Screen.AllScreens[i];
78-
if (screen.Primary)
53+
_windowLockScreen = serviceProvider.GetRequiredService<WindowLockScreen>();
54+
_windowLockScreen.OnUnlock += FmLockScreen_OnUnlock;
55+
_windowLockScreen.Closing += (_, _) =>
7956
{
80-
continue;
81-
}
82-
_logger.Write($"锁定服务 -> 准备副屏幕{i}");
83-
84-
var blankScreen = _serviceProvider.GetRequiredService<WindowBlankScreen>();
85-
blankScreen.OnDeviceInput += BlankScreen_OnDeviceInput;
86-
ShowWindowOnScreen(blankScreen, screen);
57+
_windowLockScreen.OnUnlock -= FmLockScreen_OnUnlock;
58+
};
59+
ShowWindowOnScreen(_windowLockScreen, primaryScreen);
8760

88-
_logger.Write("锁定服务 -> 激活副屏幕");
89-
_blankScreens.Add(blankScreen);
90-
}
61+
logger.Write("锁定服务 -> 激活主屏幕");
9162

92-
if (_appSettings.IsHideMouseCursor)
93-
{
94-
_logger.Write("锁定服务 -> 隐藏鼠标光标");
95-
_mouseHook.HideCursor();
96-
}
97-
OnLock?.Invoke(this, EventArgs.Empty);
63+
for (var i = 0; i <= Screen.AllScreens.Length - 1; i++)
64+
{
65+
var screen = Screen.AllScreens[i];
66+
if (screen.Primary)
67+
{
68+
continue;
69+
}
70+
logger.Write($"锁定服务 -> 准备副屏幕{i}");
71+
var blankScreen = serviceProvider.GetRequiredService<WindowBlankScreen>();
72+
blankScreen.OnDeviceInput += BlankScreen_OnDeviceInput;
73+
ShowWindowOnScreen(blankScreen, screen);
74+
_blankScreens.Add(blankScreen);
75+
}
76+
});
9877
}
9978

10079
private void ShowWindowOnScreen(Window window, Screen screen)
@@ -111,7 +90,7 @@ private void ShowWindowOnScreen(Window window, Screen screen)
11190

11291
// 在窗口加载后,根据屏幕的 DPI 重新调整位置和大小
11392
// 必须先显示窗口,然后才能获取 DPI,所以窗口大小和位置需要二次调整
114-
window.Loaded += (sender, e) =>
93+
window.Loaded += (_, _) =>
11594
{
11695
var dpiFactor = GetDpiFactor(window);
11796
window.Left = bounds.Left / dpiFactor.X;
@@ -139,57 +118,52 @@ private void ShowWindowOnScreen(Window window, Screen screen)
139118
}
140119
private void FmLockScreen_OnUnlock(object? sender, EventArgs e)
141120
{
142-
_logger.Write("锁定服务 -> 准备解锁");
121+
logger.Write("锁定服务 -> 准备解锁");
143122
foreach (var screen in _blankScreens)
144123
{
145-
_logger.Write("锁定服务 -> 释放副屏幕资源");
124+
logger.Write("锁定服务 -> 释放副屏幕资源");
146125
screen.OnDeviceInput -= BlankScreen_OnDeviceInput;
147126
screen.Unlock();
148127
screen.Close();
149128
}
150-
_logger.Write("锁定服务 -> 恢复任务管理器和系统键");
151-
_taskManagerHook.EnabledTaskManager();
152-
_systemKeyHook.Dispose();
153-
_isLocked = false;
154-
if (_appSettings.LockAnimation)
155-
{
156-
_logger.Write("锁定服务 -> 解锁动画");
157-
ShowPopup(_lang["UnLocked"]);
158-
}
159129

160-
if (_appSettings.IsHideMouseCursor)
130+
_isLocked = false;
131+
if (appSettings.LockAnimation)
161132
{
162-
_logger.Write("锁定服务 -> 恢复鼠标光标");
163-
_mouseHook.ResetCursorState();
133+
logger.Write("锁定服务 -> 解锁动画");
134+
ShowPopup(lang["UnLocked"]);
164135
}
165136

166-
_logger.Write("锁定服务 -> 通知解锁");
137+
logger.Write("锁定服务 -> 通知解锁");
167138
OnUnlock?.Invoke(this, EventArgs.Empty);
168139
}
169140
private void BlankScreen_OnDeviceInput(object? sender, EventArgs e)
170141
{
171-
_logger.Write("锁定服务 -> 收到副屏解锁通知");
142+
logger.Write("锁定服务 -> 收到副屏解锁通知");
172143
_windowLockScreen?.ShowPassword();
173144
}
174145

175146
private void ShowPopup(string message)
176147
{
177-
var popup = new WindowPopup(message);
178-
double primaryScreenWidth = SystemParameters.PrimaryScreenWidth;
179-
double primaryScreenHeight = SystemParameters.PrimaryScreenHeight;
180-
popup.Left = (primaryScreenWidth - popup.Width) / 2;
181-
popup.Top = (primaryScreenHeight - popup.Height) / 2;
182-
popup.Show();
183-
184-
var timer = new DispatcherTimer()
148+
Application.Current.Dispatcher.Invoke(() =>
185149
{
186-
Interval = TimeSpan.FromMilliseconds(1100),
187-
};
188-
timer.Tick += (_, __) =>
189-
{
190-
timer.Stop();
191-
popup.CloseWindow();
192-
};
193-
timer.Start();
150+
var popup = new WindowPopup(message);
151+
double primaryScreenWidth = SystemParameters.PrimaryScreenWidth;
152+
double primaryScreenHeight = SystemParameters.PrimaryScreenHeight;
153+
popup.Left = (primaryScreenWidth - popup.Width) / 2;
154+
popup.Top = (primaryScreenHeight - popup.Height) / 2;
155+
popup.Show();
156+
157+
var timer = new DispatcherTimer()
158+
{
159+
Interval = TimeSpan.FromMilliseconds(1100),
160+
};
161+
timer.Tick += (_, _) =>
162+
{
163+
timer.Stop();
164+
popup.CloseWindow();
165+
};
166+
timer.Start();
167+
});
194168
}
195169
}

0 commit comments

Comments
 (0)