Skip to content

Commit 12e7411

Browse files
committed
#19 屏幕缩放比例过大、分辨率不一致时可能导致窗口位置异常
1 parent a6c27db commit 12e7411

File tree

4 files changed

+44
-13
lines changed

4 files changed

+44
-13
lines changed

src/ComputerLock/Services/LockService.cs

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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("锁定服务 -> 准备解锁");

src/ComputerLock/WindowBlankScreen.xaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
66
mc:Ignorable="d"
77
Title=""
8-
WindowStyle="None"
98
Topmost="True"
109
ShowInTaskbar="False"
1110
Background="Transparent"

src/ComputerLock/WindowBlankScreen.xaml.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ public WindowBlankScreen(AppSettings appSettings, ILogger logger)
2323
private void Window_Loaded(object sender, RoutedEventArgs e)
2424
{
2525
_logger.Write("副屏幕 -> 准备锁定");
26-
WindowState = WindowState.Maximized;
2726
}
2827

2928
private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)

src/ComputerLock/WindowLockScreen.xaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
66
mc:Ignorable="d"
77
Title=""
8-
WindowStyle="None"
98
Topmost="True"
10-
WindowState="Maximized"
119
Background="Transparent"
1210
AllowsTransparency="True"
1311
ShowInTaskbar="False"

0 commit comments

Comments
 (0)