11using Microsoft . Extensions . DependencyInjection ;
22using System . Windows ;
33using System . Windows . Threading ;
4+ using Application = System . Windows . Application ;
45
56namespace 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