CodeBlocks DLL实现每20秒自动终止指定进程的代码方案
Windows平台20秒间隔循环终止指定进程实现方案
现有代码问题修正
你写的单次终止进程逻辑核心是对的,先修正三个会直接导致编译/运行异常的小问题:
- C语言大小写敏感,你定义的函数名为
KillProcessByName,main函数里调用写的是killProcessByName,首字母大小写不匹配,CodeBlocks编译会直接报错,需要统一命名 - 创建进程快照时不需要用
TH32CS_SNAPALL参数,只枚举进程的话用TH32CS_SNAPPROCESS即可,能减少不必要的系统开销 - 原代码用
strcmp做进程名匹配是大小写敏感的,遇到NOTEPAD.EXE这类大小写不同的进程名会匹配失败,建议替换为不区分大小写的_stricmp
两种定时实现方案
根据你最终编译为独立EXE还是DLL选择对应方案即可:
方案1:Sleep死循环(适合独立EXE程序,实现最简单)
直接在主逻辑中增加无限循环,每次执行完杀进程操作后调用Sleep接口挂起线程即可,Sleep参数单位为毫秒,20秒对应传入20000。
完整可运行代码如下:
#include <windows.h> #include <tlhelp32.h> #include <string.h> void KillProcessByName(const char *filename) { HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pEntry; pEntry.dwSize = sizeof(pEntry); BOOL hRes = Process32First(hSnapShot, &pEntry); while (hRes) { if (_stricmp(pEntry.szExeFile, filename) == 0) { HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pEntry.th32ProcessID); if (hProcess != NULL) { TerminateProcess(hProcess, 9); CloseHandle(hProcess); } } hRes = Process32Next(hSnapShot, &pEntry); } CloseHandle(hSnapShot); } int main() { while (TRUE) { KillProcessByName("Notepad.exe"); Sleep(20000); } return 0; }
CodeBlocks编译配置提示:需要在项目构建选项的链接器设置中添加
-lkernel32,否则会出现Win32 API链接错误。
方案2:定时器回调(适合DLL开发场景,不阻塞宿主线程)
如果你开发的是注入类DLL,绝对不能在DllMain中写死循环阻塞宿主主线程,否则会导致宿主进程加载DLL卡死。这种场景用Win32自带的SetTimer接口注册定时回调即可,核心代码片段:
// 定时触发的回调函数 VOID CALLBACK KillProcessTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { KillProcessByName("Notepad.exe"); } // 在DLL_PROCESS_ATTACH事件中调用该函数启动定时器即可 void StartSchedule() { // 第三个参数为定时间隔,单位毫秒,20000对应20秒 SetTimer(NULL, 1, 20000, (TIMERPROC)KillProcessTimerProc); }
额外注意点
- 若需要终止系统级权限运行的进程,程序本身需要持有管理员权限,否则
OpenProcess会返回空值,终止进程失败 - 不需要额外引入第三方定时库,以上两种方案都基于Windows原生API实现,无额外依赖
- 如果需要停止定时逻辑,EXE版本直接break循环即可,DLL版本调用
KillTimer接口销毁对应定时器
内容的提问来源于stack exchange,提问作者Dona
相关产品推荐
相关产品推荐

