Skip to content

Commit 52d4af2

Browse files
authored
Update TimerResolutionModifier.cpp
1 parent ae31d7e commit 52d4af2

File tree

1 file changed

+5
-20
lines changed

1 file changed

+5
-20
lines changed

TimerResolutionModifier.cpp

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,22 @@
22
#include <Windows.h>
33
#include <timeapi.h>
44

5+
// 链接所需的库
56
#pragma comment(lib, "Winmm.lib")
7+
#pragma comment(lib, "User32.lib") // <-- 新增:链接 User32.lib 库以使用窗口相关的API
68

79
// 全局变量,用于线程控制和状态管理
8-
// volatile 关键字确保多线程访问时的可见性,防止编译器过度优化
9-
static volatile bool g_runThread = false; // 控制监控线程运行的标志
10-
static volatile bool g_isTimerHigh = false; // 记录当前计时器是否已处于高精度状态
11-
static HANDLE g_hThread = NULL; // 监控线程的句柄
10+
static volatile bool g_runThread = false;
11+
static volatile bool g_isTimerHigh = false;
12+
static HANDLE g_hThread = NULL;
1213

1314
// 监控线程的主函数
1415
DWORD WINAPI MonitorThread(LPVOID lpParam)
1516
{
16-
// 获取当前进程(即被注入的进程)的ID
1717
const DWORD currentProcessId = GetCurrentProcessId();
1818

1919
while (g_runThread)
2020
{
21-
// 获取当前前台窗口的句柄
2221
HWND hForegroundWnd = GetForegroundWindow();
2322
bool isForeground = false;
2423

@@ -32,10 +31,8 @@ DWORD WINAPI MonitorThread(LPVOID lpParam)
3231
}
3332
}
3433

35-
// 如果当前进程是前台进程...
3634
if (isForeground)
3735
{
38-
// ...并且计时器还不是高精度状态,则设置它
3936
if (!g_isTimerHigh)
4037
{
4138
if (timeBeginPeriod(1) == TIMERR_NOERROR)
@@ -44,10 +41,8 @@ DWORD WINAPI MonitorThread(LPVOID lpParam)
4441
}
4542
}
4643
}
47-
// 如果当前进程是后台进程...
4844
else
4945
{
50-
// ...并且计时器当前是高精度状态,则恢复它
5146
if (g_isTimerHigh)
5247
{
5348
if (timeEndPeriod(1) == TIMERR_NOERROR)
@@ -57,12 +52,9 @@ DWORD WINAPI MonitorThread(LPVOID lpParam)
5752
}
5853
}
5954

60-
// 等待一小段时间再进行下一次检查,以避免CPU占用过高
61-
// 250毫秒的检查频率对于前后台切换检测来说绰绰有余
6255
Sleep(250);
6356
}
6457

65-
// 线程退出前,最后检查一次,确保恢复计时器精度
6658
if (g_isTimerHigh)
6759
{
6860
timeEndPeriod(1);
@@ -87,30 +79,23 @@ BOOL APIENTRY DllMain( HMODULE hModule,
8779
switch (ul_reason_for_call)
8880
{
8981
case DLL_PROCESS_ATTACH:
90-
// 优化:禁止对后续的线程创建/销毁事件调用DllMain,减少开销
9182
DisableThreadLibraryCalls(hModule);
92-
93-
// 设置运行标志并创建监控线程
9483
g_runThread = true;
9584
g_hThread = CreateThread(NULL, 0, MonitorThread, NULL, 0, NULL);
9685
break;
9786

9887
case DLL_PROCESS_DETACH:
99-
// 通知监控线程停止
10088
if (g_hThread)
10189
{
10290
g_runThread = false;
103-
// 等待线程安全退出(最多等待5秒)
10491
WaitForSingleObject(g_hThread, 5000);
105-
// 关闭线程句柄,释放资源
10692
CloseHandle(g_hThread);
10793
g_hThread = NULL;
10894
}
10995
break;
11096

11197
case DLL_THREAD_ATTACH:
11298
case DLL_THREAD_DETACH:
113-
// 不做任何事
11499
break;
115100
}
116101
return TRUE;

0 commit comments

Comments
 (0)