2
2
#include < Windows.h>
3
3
#include < timeapi.h>
4
4
5
+ // 链接所需的库
5
6
#pragma comment(lib, "Winmm.lib")
7
+ #pragma comment(lib, "User32.lib") // <-- 新增:链接 User32.lib 库以使用窗口相关的API
6
8
7
9
// 全局变量,用于线程控制和状态管理
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 ;
12
13
13
14
// 监控线程的主函数
14
15
DWORD WINAPI MonitorThread (LPVOID lpParam)
15
16
{
16
- // 获取当前进程(即被注入的进程)的ID
17
17
const DWORD currentProcessId = GetCurrentProcessId ();
18
18
19
19
while (g_runThread)
20
20
{
21
- // 获取当前前台窗口的句柄
22
21
HWND hForegroundWnd = GetForegroundWindow ();
23
22
bool isForeground = false ;
24
23
@@ -32,10 +31,8 @@ DWORD WINAPI MonitorThread(LPVOID lpParam)
32
31
}
33
32
}
34
33
35
- // 如果当前进程是前台进程...
36
34
if (isForeground)
37
35
{
38
- // ...并且计时器还不是高精度状态,则设置它
39
36
if (!g_isTimerHigh)
40
37
{
41
38
if (timeBeginPeriod (1 ) == TIMERR_NOERROR)
@@ -44,10 +41,8 @@ DWORD WINAPI MonitorThread(LPVOID lpParam)
44
41
}
45
42
}
46
43
}
47
- // 如果当前进程是后台进程...
48
44
else
49
45
{
50
- // ...并且计时器当前是高精度状态,则恢复它
51
46
if (g_isTimerHigh)
52
47
{
53
48
if (timeEndPeriod (1 ) == TIMERR_NOERROR)
@@ -57,12 +52,9 @@ DWORD WINAPI MonitorThread(LPVOID lpParam)
57
52
}
58
53
}
59
54
60
- // 等待一小段时间再进行下一次检查,以避免CPU占用过高
61
- // 250毫秒的检查频率对于前后台切换检测来说绰绰有余
62
55
Sleep (250 );
63
56
}
64
57
65
- // 线程退出前,最后检查一次,确保恢复计时器精度
66
58
if (g_isTimerHigh)
67
59
{
68
60
timeEndPeriod (1 );
@@ -87,30 +79,23 @@ BOOL APIENTRY DllMain( HMODULE hModule,
87
79
switch (ul_reason_for_call)
88
80
{
89
81
case DLL_PROCESS_ATTACH:
90
- // 优化:禁止对后续的线程创建/销毁事件调用DllMain,减少开销
91
82
DisableThreadLibraryCalls (hModule);
92
-
93
- // 设置运行标志并创建监控线程
94
83
g_runThread = true ;
95
84
g_hThread = CreateThread (NULL , 0 , MonitorThread, NULL , 0 , NULL );
96
85
break ;
97
86
98
87
case DLL_PROCESS_DETACH:
99
- // 通知监控线程停止
100
88
if (g_hThread)
101
89
{
102
90
g_runThread = false ;
103
- // 等待线程安全退出(最多等待5秒)
104
91
WaitForSingleObject (g_hThread, 5000 );
105
- // 关闭线程句柄,释放资源
106
92
CloseHandle (g_hThread);
107
93
g_hThread = NULL ;
108
94
}
109
95
break ;
110
96
111
97
case DLL_THREAD_ATTACH:
112
98
case DLL_THREAD_DETACH:
113
- // 不做任何事
114
99
break ;
115
100
}
116
101
return TRUE ;
0 commit comments