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
相关产品推荐
相关产品推荐

