You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:00:49