@@ -64,15 +64,13 @@ public void Lock()
6464
6565 _logger . Write ( "锁定服务 -> 准备主屏幕" ) ;
6666 _windowLockScreen = _serviceProvider . GetRequiredService < WindowLockScreen > ( ) ;
67- _windowLockScreen . Left = primaryScreen . WorkingArea . Left ;
68- _windowLockScreen . Top = primaryScreen . WorkingArea . Top ;
6967 _windowLockScreen . OnUnlock += FmLockScreen_OnUnlock ;
7068 _windowLockScreen . Closing += ( _ , _ ) =>
7169 {
7270 _windowLockScreen . OnUnlock -= FmLockScreen_OnUnlock ;
7371 } ;
74- _windowLockScreen . Show ( ) ;
75- _windowLockScreen . Activate ( ) ;
72+ ShowWindowOnScreen ( _windowLockScreen , primaryScreen ) ;
73+
7674 _logger . Write ( "锁定服务 -> 激活主屏幕" ) ;
7775 for ( var i = 0 ; i <= Screen . AllScreens . Length - 1 ; i ++ )
7876 {
@@ -84,12 +82,9 @@ public void Lock()
8482 _logger . Write ( $ "锁定服务 -> 准备副屏幕{ i } ") ;
8583
8684 var blankScreen = _serviceProvider . GetRequiredService < WindowBlankScreen > ( ) ;
87- blankScreen . WindowStartupLocation = WindowStartupLocation . Manual ;
88- blankScreen . Left = screen . WorkingArea . Left ;
89- blankScreen . Top = screen . WorkingArea . Top ;
9085 blankScreen . OnDeviceInput += BlankScreen_OnDeviceInput ;
91- blankScreen . Show ( ) ;
92- blankScreen . Activate ( ) ;
86+ ShowWindowOnScreen ( blankScreen , screen ) ;
87+
9388 _logger . Write ( "锁定服务 -> 激活副屏幕" ) ;
9489 _blankScreens . Add ( blankScreen ) ;
9590 }
@@ -102,6 +97,46 @@ public void Lock()
10297 OnLock ? . Invoke ( this , EventArgs . Empty ) ;
10398 }
10499
100+ private void ShowWindowOnScreen ( Window window , Screen screen )
101+ {
102+ // 获取包括任务栏的完整屏幕区域
103+ var bounds = screen . Bounds ;
104+
105+ // 设置窗口初始位置和大小
106+ window . WindowStartupLocation = WindowStartupLocation . Manual ;
107+ window . Left = bounds . Left ;
108+ window . Top = bounds . Top ;
109+ window . Width = bounds . Width ;
110+ window . Height = bounds . Height ;
111+
112+ // 在窗口加载后,根据屏幕的 DPI 重新调整位置和大小
113+ // 必须先显示窗口,然后才能获取 DPI,所以窗口大小和位置需要二次调整
114+ window . Loaded += ( sender , e ) =>
115+ {
116+ var dpiFactor = GetDpiFactor ( window ) ;
117+ window . Left = bounds . Left / dpiFactor . X ;
118+ window . Top = bounds . Top / dpiFactor . Y ;
119+ window . Width = bounds . Width / dpiFactor . X ;
120+ window . Height = bounds . Height / dpiFactor . Y ;
121+ } ;
122+
123+ window . WindowStyle = WindowStyle . None ;
124+ window . ResizeMode = System . Windows . ResizeMode . NoResize ;
125+
126+ window . Show ( ) ;
127+ window . Activate ( ) ;
128+ }
129+
130+ private ( double X , double Y ) GetDpiFactor ( Window window )
131+ {
132+ var source = PresentationSource . FromVisual ( window ) ;
133+ if ( source ? . CompositionTarget != null )
134+ {
135+ var transform = source . CompositionTarget . TransformToDevice ;
136+ return ( transform . M11 , transform . M22 ) ;
137+ }
138+ return ( 1.0 , 1.0 ) ; // 默认比例
139+ }
105140 private void FmLockScreen_OnUnlock ( object ? sender , EventArgs e )
106141 {
107142 _logger . Write ( "锁定服务 -> 准备解锁" ) ;
0 commit comments