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

Windows API与C++:获取自建进程PID并定时终止的实现咨询

嘿,作为C++和Windows API的新手,你已经迈出了很棒的第一步——能拿到第一个进程的PID,接下来扩展到多进程创建+定时终止其实没那么复杂!我给你整理了一套完整的实现方案,带详细注释,你跟着一步步来就行。

完整实现代码
#include <Windows.h>
#include <iostream>
#include <chrono>
#include <thread>
#include <vector>

// 用来存储每个进程的PID和句柄,方便后续操作
struct ProcessData {
    DWORD pid;
    HANDLE processHandle;
};

int main() {
    const int processCount = 4; // 要创建的进程数量,按需修改
    std::vector<ProcessData> processes;

    // 循环创建指定数量的进程
    for (int i = 1; i <= processCount; ++i) {
        STARTUPINFO si = {0};
        PROCESS_INFORMATION pi = {0};
        si.cb = sizeof(STARTUPINFO); // 必须初始化这个字段

        // 调用CreateProcess创建记事本进程
        BOOL createSuccess = CreateProcess(
            TEXT("notepad.exe"),  // 要启动的程序,也可以写完整路径如C:\\Windows\\notepad.exe
            nullptr,              // 命令行参数,这里不需要额外参数
            nullptr,              // 进程安全属性,使用默认设置
            nullptr,              // 线程安全属性,使用默认设置
            FALSE,                // 不继承父进程的句柄
            0,                    // 创建标志,默认启动方式
            nullptr,              // 环境变量,继承父进程
            nullptr,              // 当前工作目录,继承父进程
            &si,                  // 启动信息结构体
            &pi                   // 输出进程/线程的信息(含PID和句柄)
        );

        if (!createSuccess) {
            std::cout << "创建第" << i << "个进程失败!错误码:" << GetLastError() << std::endl;
            continue;
        }

        // 保存当前进程的PID和句柄
        ProcessData data;
        data.pid = pi.dwProcessId;
        data.processHandle = pi.hProcess;
        processes.push_back(data);

        // 打印进程信息
        std::cout << "成功创建第" << i << "个进程,PID:" << data.pid << std::endl;

        // 关闭线程句柄(我们不需要操作线程,及时释放资源)
        CloseHandle(pi.hThread);
    }

    // 等待指定时间,这里设置为5秒,可按需修改
    std::cout << "\n等待5秒后将终止所有创建的进程..." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(5));

    // 遍历所有进程,逐个终止
    for (size_t i = 0; i < processes.size(); ++i) {
        ProcessData& data = processes[i];
        BOOL terminateSuccess = TerminateProcess(data.processHandle, 0);
        if (terminateSuccess) {
            std::cout << "成功终止PID为" << data.pid << "的进程" << std::endl;
        } else {
            std::cout << "终止PID为" << data.pid << "的进程失败!错误码:" << GetLastError() << std::endl;
        }
        // 关闭进程句柄,释放系统资源
        CloseHandle(data.processHandle);
    }

    std::cout << "\n所有操作完成,按任意键退出..." << std::endl;
    system("pause");
    return 0;
}
关键部分解释
  • 进程创建与PID获取:CreateProcess是Windows API创建进程的核心函数,执行成功后会在PROCESS_INFORMATION结构体里返回进程的PID(dwProcessId)和进程句柄(hProcess),我们把这些信息存到自定义的ProcessData结构体里,方便后续终止操作。
  • 定时等待:用std::chrono::seconds(5)指定等待时长,配合std::this_thread::sleep_for实现阻塞等待,你可以改成std::chrono::minutes(1)等待1分钟,或者std::chrono::milliseconds(2000)等待2秒,灵活调整。
  • 进程终止:TerminateProcess用来强制终止进程,第一个参数是进程句柄,第二个是退出码(一般传0即可)。如果想让程序优雅退出(比如让记事本弹出保存提示),可以用PostMessage给窗口发送WM_CLOSE消息,但新手先从强制终止入手更简单。
  • 资源清理:创建进程后会生成线程句柄和进程句柄,不用的句柄一定要用CloseHandle关闭,否则会造成系统资源泄漏。
注意事项
  • 编译时确保项目是Windows控制台程序,IDE一般会自动链接必要的库(如user32.lib),如果报错可以手动添加链接依赖。
  • 如果CreateProcess失败,调用GetLastError()获取错误码,查Windows API文档就能知道具体原因(比如路径错误、权限不足等)。
  • 要创建其他程序,只需把TEXT("notepad.exe")改成对应程序的路径即可,比如TEXT("calc.exe")就是计算器。

内容的提问来源于stack exchange,提问作者Master James

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:48:46