Skip to content

Commit 03c83d4

Browse files
committed
Windows 锁定时自动解锁程序
1 parent a1beba1 commit 03c83d4

File tree

11 files changed

+126
-29
lines changed

11 files changed

+126
-29
lines changed

src/ComputerLock/Configuration/AppSettings.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ public void Initialize(HotkeyTools hotkeyTools)
3030
/// </summary>
3131
public bool IsDisableWindowsLock { get; set; } = true;
3232

33+
/// <summary>
34+
/// Windows 锁定时自动解锁程序
35+
/// </summary>
36+
public bool IsUnlockWhenWindowsLock { get; set; } = false;
37+
3338
/// <summary>
3439
/// 锁定时显示动画
3540
/// </summary>

src/ComputerLock/Pages/Index.razor

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@
2020
Color="Color.Primary" />
2121
</MudTooltip>
2222
</div>
23+
<div class="d-flex">
24+
<MudSwitch @bind-Value="@(AppSettings.IsUnlockWhenWindowsLock)"
25+
@bind-Value:after="SaveSettings"
26+
Label="@(Lang["IdleWhenWindowsLock"])"
27+
Color="Color.Primary" />
28+
<MudChip T="string"
29+
Size="Size.Small"
30+
Variant="Variant.Text"
31+
Color="Color.Primary">@(Lang["SuggestedToEnable"])</MudChip>
32+
</div>
2333
<div class="d-flex">
2434
<MudSwitch @bind-Value="@(AppSettings.IsHideMouseCursor)"
2535
@bind-Value:after="SaveSettings"

src/ComputerLock/Resources/Lang.Designer.cs

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ComputerLock/Resources/Lang.en.resx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,4 +351,10 @@
351351
<data name="UnlockPasswordUndefined" xml:space="preserve">
352352
<value>The screen unlock password is not set</value>
353353
</data>
354+
<data name="IdleWhenWindowsLock" xml:space="preserve">
355+
<value>System unlock when windows lock</value>
356+
</data>
357+
<data name="SuggestedToEnable" xml:space="preserve">
358+
<value>Suggested to Enable</value>
359+
</data>
354360
</root>

src/ComputerLock/Resources/Lang.resx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,4 +369,10 @@
369369
<data name="UnlockPasswordUndefined" xml:space="preserve">
370370
<value />
371371
</data>
372+
<data name="IdleWhenWindowsLock" xml:space="preserve">
373+
<value />
374+
</data>
375+
<data name="SuggestedToEnable" xml:space="preserve">
376+
<value />
377+
</data>
372378
</root>

src/ComputerLock/Resources/Lang.zh.resx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@
136136
<value>开机时自动启动</value>
137137
</data>
138138
<data name="DisableWindowsLock" xml:space="preserve">
139-
<value>锁定时禁用 Windows 锁屏</value>
139+
<value>程序锁定时禁用 Windows 自动屏幕锁定</value>
140140
</data>
141141
<data name="HidePasswordWindow" xml:space="preserve">
142142
<value>无操作时自动隐藏密码框</value>
@@ -348,4 +348,10 @@
348348
<data name="UnlockPasswordUndefined" xml:space="preserve">
349349
<value>锁屏失败:请先设置解锁密码</value>
350350
</data>
351+
<data name="IdleWhenWindowsLock" xml:space="preserve">
352+
<value>Windows 屏幕锁定时停止程序锁定服务</value>
353+
</data>
354+
<data name="SuggestedToEnable" xml:space="preserve">
355+
<value>建议开启</value>
356+
</data>
351357
</root>

src/ComputerLock/Services/GlobalLockService.cs

Lines changed: 65 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ internal class GlobalLockService : IGlobalLockService
2121
private readonly IWindowsMessageBox _messageBox;
2222
private readonly IStringLocalizer<Lang> _lang;
2323
public bool IsLocked { get; private set; }
24+
private bool _isWindowsLocked;
2425
private CancellationTokenSource? _cts;
2526
public GlobalLockService(ILogger logger, AppSettings appSettings, UserActivityMonitor activityMonitor, HotkeyHook hotkeyHook, TaskManagerHook taskManagerHook, MouseHook mouseHook, SystemKeyHook systemKeyHook, IServiceProvider serviceProvider, IWindowsMessageBox messageBox, IStringLocalizer<Lang> lang)
2627
{
@@ -41,8 +42,10 @@ public GlobalLockService(ILogger logger, AppSettings appSettings, UserActivityMo
4142
_lang = lang;
4243

4344
InitActivityMonitor();
44-
}
4545

46+
_logger.Write("空闲自动锁定 -> 准备监控系统会话状态");
47+
SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
48+
}
4649

4750
/// <summary>
4851
/// 初始化空闲检测
@@ -55,34 +58,68 @@ private void InitActivityMonitor()
5558
Lock();
5659
};
5760

58-
_logger.Write("空闲自动锁定 -> 准备监控系统会话状态");
59-
SystemEvents.SessionSwitch += (_, e) =>
61+
AutoLockStart();
62+
}
63+
64+
/// <summary>
65+
/// Windows 事件监控
66+
/// </summary>
67+
private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
68+
{
69+
if (e.Reason == SessionSwitchReason.SessionLock)
6070
{
61-
// 如果已经手动锁定,不处理系统锁定事件
62-
if (IsLocked)
63-
{
64-
return;
65-
}
66-
if (e.Reason == SessionSwitchReason.SessionLock)
71+
_isWindowsLocked = true;
72+
WindowsLock();
73+
}
74+
else if (e.Reason == SessionSwitchReason.SessionUnlock)
75+
{
76+
_isWindowsLocked = false;
77+
WindowsUnlock();
78+
}
79+
}
80+
81+
/// <summary>
82+
/// Windows 操作系统锁定
83+
/// </summary>
84+
private void WindowsLock()
85+
{
86+
if (!_appSettings.IsUnlockWhenWindowsLock)
87+
{
88+
if (!IsLocked)
6789
{
68-
// Windows 操作系统锁定
69-
_logger.Write("空闲自动锁定 -> Windows系统锁定,暂停空闲检测");
90+
_logger.Write("系统 -> Windows 系统锁定,暂停空闲检测");
7091
_activityMonitor.StopMonitoring();
7192
}
72-
else if (e.Reason == SessionSwitchReason.SessionUnlock)
93+
}
94+
else
95+
{
96+
_logger.Write("系统 -> Windows 系统锁定,程序解锁");
97+
Unlock();
98+
}
99+
}
100+
101+
/// <summary>
102+
/// Windows 操作系统解锁
103+
/// </summary>
104+
private void WindowsUnlock()
105+
{
106+
if (!_appSettings.IsUnlockWhenWindowsLock)
107+
{
108+
if (!IsLocked)
73109
{
74-
// Windows 操作系统解锁
75-
_logger.Write($"空闲自动锁定 -> Windows系统解锁,恢复空闲检测,{_appSettings.AutoLockSecond} 秒");
76-
_activityMonitor.SetAutoLockSecond(_appSettings.AutoLockSecond);
77-
_activityMonitor.StartMonitoring();
110+
_logger.Write($"系统 -> Windows 系统解锁");
111+
AutoLockStart();
78112
}
79-
};
80-
81-
AutoLockStart();
113+
}
82114
}
83115

84116
private void AutoLockStart()
85117
{
118+
if (_isWindowsLocked && _appSettings.IsUnlockWhenWindowsLock)
119+
{
120+
_logger.Write($"系统 -> Windows 锁定状态,不启用空闲检测");
121+
}
122+
86123
if (_appSettings.AutoLockSecond > 0)
87124
{
88125
_logger.Write($"系统 -> 启动空闲检测,{_appSettings.AutoLockSecond} 秒");
@@ -93,6 +130,12 @@ private void AutoLockStart()
93130

94131
public void Lock()
95132
{
133+
if (_isWindowsLocked && _appSettings.IsUnlockWhenWindowsLock)
134+
{
135+
_logger.Write($"系统 -> Windows 锁定状态禁止程序锁定");
136+
return;
137+
}
138+
96139
if (!CheckLockConfig(out var message))
97140
{
98141
_messageBox.Show(message);
@@ -214,6 +257,8 @@ public void Unlock()
214257

215258
public void UpdateAutoLockSettings()
216259
{
260+
_logger.Write("系统 -> 更新自动锁定设置");
261+
_logger.Write("系统 -> 停止空闲检测");
217262
_activityMonitor.StopMonitoring();
218263
AutoLockStart();
219264
}
@@ -254,5 +299,6 @@ private void SystemUnlock()
254299
public void Dispose()
255300
{
256301
_hotkeyHook.Dispose();
302+
SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch;
257303
}
258304
}

src/ComputerLock/Services/HotkeyScreenLockService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public override void Unlock()
5353
logger.Write("快捷键屏幕锁定 -> 准备解锁");
5454
foreach (var screen in _blankScreens)
5555
{
56-
logger.Write("快捷键屏幕锁定 -> 释放副屏幕资源");
56+
logger.Write("快捷键屏幕锁定 -> 释放空白屏幕资源");
5757
screen.Unlock();
5858
screen.Close();
5959
}

src/ComputerLock/Services/PasswordScreenLockService.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public override bool Lock(bool showAnimation)
4242
{
4343
_windowLockScreen.OnUnlock -= FmLockScreen_OnUnlock;
4444
};
45-
logger.Write("密码屏幕锁定 -> 激活主屏幕");
45+
logger.Write("密码屏幕锁定 -> 激活功能屏幕");
4646
ShowWindowOnScreen(_windowLockScreen, primaryScreen);
4747

4848
for (var i = 0; i <= Screen.AllScreens.Length - 1; i++)
@@ -52,10 +52,10 @@ public override bool Lock(bool showAnimation)
5252
{
5353
continue;
5454
}
55-
logger.Write($"密码屏幕锁定 -> 准备副屏幕{i}");
55+
logger.Write($"密码屏幕锁定 -> 准备空白屏幕{i}");
5656
var blankScreen = serviceProvider.GetRequiredService<WindowBlankScreen>();
5757
blankScreen.OnDeviceInput += BlankScreen_OnDeviceInput;
58-
logger.Write($"密码屏幕锁定 -> 激活副屏幕{i}");
58+
logger.Write($"密码屏幕锁定 -> 激活空白屏幕{i}");
5959
ShowWindowOnScreen(blankScreen, screen);
6060
_blankScreens.Add(blankScreen);
6161
}
@@ -70,10 +70,10 @@ public override void Unlock()
7070

7171
private void FmLockScreen_OnUnlock(object? sender, EventArgs e)
7272
{
73-
logger.Write("密码屏幕锁定 -> 主屏幕准备解锁");
73+
logger.Write("密码屏幕锁定 -> 功能屏幕准备解锁");
7474
foreach (var screen in _blankScreens)
7575
{
76-
logger.Write("密码屏幕锁定 -> 释放副屏幕资源");
76+
logger.Write("密码屏幕锁定 -> 释放空白屏幕资源");
7777
screen.OnDeviceInput -= BlankScreen_OnDeviceInput;
7878
screen.Unlock();
7979
screen.Close();

src/ComputerLock/WindowLockScreen.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ private void Timer_Tick(object? sender, EventArgs e)
115115
{
116116
var hideCountdown = Convert.ToInt32(_hideSelfTime.Subtract(time).TotalSeconds);
117117
LblMessage.Content = $"{_lang["TimerPrefix"]}{hideCountdown}{_lang["TimerPostfix"]}";
118-
if (hideCountdown <= 0)
118+
if (hideCountdown == 0)
119119
{
120120
_logger.Write("功能屏幕 -> 准备自动隐藏密码框");
121121
HidePassword();

0 commit comments

Comments
 (0)