Skip to content

Commit 1debfe4

Browse files
committed
任务管理器状态恢复机制
1 parent 923cb64 commit 1debfe4

File tree

2 files changed

+72
-13
lines changed

2 files changed

+72
-13
lines changed
Lines changed: 68 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,94 @@
11
using Microsoft.Win32;
2+
using System.IO;
23

34
namespace ComputerLock.Platforms;
45
internal class TaskManagerHook
56
{
7+
private static readonly string OriginalStateFilePath = Path.Combine(Path.GetTempPath(), $"{AppBase.FriendlyName}_OriginalTaskMgr");
68
private const string RegKey = @"Software\Microsoft\Windows\CurrentVersion\Policies\System";
9+
private const string DisableTaskMgrValueName = "DisableTaskMgr";
10+
11+
private readonly ILogger _logger;
12+
713
private enum TaskManagerStateEnum
814
{
915
Enabled = 0,
1016
Disabled = 1
1117
}
1218

13-
public void EnabledTaskManager()
19+
public TaskManagerHook(ILogger logger)
1420
{
15-
SetState(TaskManagerStateEnum.Enabled);
21+
_logger = logger;
1622
}
1723

18-
public void DisabledTaskManager()
24+
public void Lock()
1925
{
26+
var currentState = GetCurrentState();
27+
SaveOriginalState(currentState);
2028
SetState(TaskManagerStateEnum.Disabled);
2129
}
2230

31+
public void Unlock()
32+
{
33+
try
34+
{
35+
string content = File.ReadAllText(OriginalStateFilePath);
36+
if (Enum.TryParse<TaskManagerStateEnum>(content, out var originalState))
37+
{
38+
SetState(originalState);
39+
}
40+
41+
File.Delete(OriginalStateFilePath);
42+
}
43+
catch (Exception ex)
44+
{
45+
_logger.Error("恢复任务管理器状态失败", ex);
46+
}
47+
}
48+
49+
/// <summary>
50+
/// 崩溃恢复
51+
/// </summary>
52+
public void RecoverFromCrash()
53+
{
54+
if (File.Exists(OriginalStateFilePath))
55+
{
56+
Unlock();
57+
}
58+
}
59+
60+
private TaskManagerStateEnum GetCurrentState()
61+
{
62+
using var registryKey = Registry.CurrentUser.OpenSubKey(RegKey);
63+
if (registryKey == null)
64+
{
65+
return TaskManagerStateEnum.Enabled;
66+
}
67+
68+
var value = registryKey.GetValue(DisableTaskMgrValueName, 0);
69+
return (int)value == 1 ? TaskManagerStateEnum.Disabled : TaskManagerStateEnum.Enabled;
70+
}
71+
72+
private void SaveOriginalState(TaskManagerStateEnum state)
73+
{
74+
try
75+
{
76+
File.WriteAllText(OriginalStateFilePath, ((int)state).ToString());
77+
}
78+
catch (Exception ex)
79+
{
80+
_logger.Error($"保存任务管理器原始状态失败", ex);
81+
}
82+
}
83+
2384
private void SetState(TaskManagerStateEnum state)
2485
{
25-
var registryKey = Registry.CurrentUser.CreateSubKey(RegKey);
86+
using var registryKey = Registry.CurrentUser.CreateSubKey(RegKey);
2687
if (registryKey == null)
2788
{
28-
throw new Exception("注册表扫描失败");
89+
_logger.Error($"注册表键不存在或无法创建:{RegKey}");
90+
return;
2991
}
30-
registryKey.SetValue("DisableTaskMgr", (int)state);
31-
registryKey.Close();
92+
registryKey.SetValue(DisableTaskMgrValueName, (int)state);
3293
}
3394
}

src/ComputerLock/Services/GlobalLockService.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,7 @@ public GlobalLockService(ILogger logger, AppSettings appSettings, UserActivityMo
3434
_hotkeyHook = hotkeyHook;
3535
_taskManagerHook = taskManagerHook;
3636

37-
// 防止锁屏时系统崩溃、重启等问题导致任务栏被禁用
38-
// 启动时默认启用一次
39-
// TODO 这里需要重新设计,不应该在这里启用任务管理器,因为有可能任务管理器是被其他程序主动禁用的
40-
_taskManagerHook.EnabledTaskManager();
37+
_taskManagerHook.RecoverFromCrash();
4138
_mouseHook = mouseHook;
4239
_systemKeyHook = systemKeyHook;
4340
_serviceProvider = serviceProvider;
@@ -69,6 +66,7 @@ private void InitActivityMonitor()
6966

7067
private void InitUserInputHandling()
7168
{
69+
_logger.Info("系统 -> 准备监听用户输入状态");
7270
_systemKeyHook.OnUserInput += (_, _) =>
7371
{
7472
if (_appSettings.LockTips && IsLocked)
@@ -191,7 +189,7 @@ public void Lock()
191189
_activityMonitor.StopMonitoring();
192190

193191
_logger.Info("全局锁定 -> 禁用任务管理器和系统键");
194-
_taskManagerHook.DisabledTaskManager();
192+
_taskManagerHook.Lock();
195193

196194
if (_appSettings.IsHideMouseCursor)
197195
{
@@ -349,7 +347,7 @@ private void SystemUnlock()
349347
AutoLockStart();
350348

351349
_logger.Info("系统解锁 -> 恢复任务管理器和系统键");
352-
_taskManagerHook.EnabledTaskManager();
350+
_taskManagerHook.Unlock();
353351

354352
if (_appSettings.IsHideMouseCursor)
355353
{

0 commit comments

Comments
 (0)