C++:如何判断通过代码启动的游戏程序是否仍在运行
实现游戏运行状态判断的方案
你的StartApp函数用ShellExecute无法直接获取启动后的进程信息,要实现运行状态判断,得先调整启动逻辑拿到进程标识,或者用进程名/窗口标题做兜底检测,具体方案如下:
一、修改启动函数,获取进程ID(推荐)
替换ShellExecute为CreateProcess,它能直接返回进程ID,后续用这个ID检测是最准确的:
#include <windows.h> #include <string> bool StartApp(const std::string& Name, DWORD& outProcessId) { std::wstring FileName(Name.begin(), Name.end()); STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; bool success = CreateProcess( NULL, const_cast<wchar_t*>(FileName.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); if (success) { outProcessId = pi.dwProcessId; // 关闭无用句柄,避免资源泄漏 CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } return success; }
二、通过进程ID判断是否运行
拿到进程ID后,用OpenProcess和GetExitCodeProcess检测进程存活状态:
bool IsProcessRunning(DWORD processId) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, processId); if (hProcess == NULL) { return false; } DWORD exitCode; bool isRunning = GetExitCodeProcess(hProcess, &exitCode); CloseHandle(hProcess); // STILL_ACTIVE 表示进程仍在运行 return isRunning && (exitCode == STILL_ACTIVE); }
三、无法修改启动函数的替代方案
如果不能调整启动逻辑,只能通过进程名或窗口标题间接检测:
1. 通过进程名称检测
遍历系统进程,匹配目标游戏的exe文件名:
#include <tlhelp32.h> bool IsProcessRunningByName(const std::wstring& processName) { bool exists = false; PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) { return false; } if (Process32First(hSnapshot, &pe32)) { do { if (_wcsicmp(pe32.szExeFile, processName.c_str()) == 0) { exists = true; break; } } while (Process32Next(hSnapshot, &pe32)); } CloseHandle(hSnapshot); return exists; }
使用示例:IsProcessRunningByName(L"YourGame.exe")
2. 通过窗口标题检测
如果游戏有固定窗口标题,用FindWindow直接查找:
bool IsGameWindowRunning(const std::wstring& windowTitle) { HWND hWnd = FindWindow(NULL, windowTitle.c_str()); return hWnd != NULL && IsWindowVisible(hWnd); }
注意事项
- 进程ID检测是最可靠的,避免了进程重名、窗口标题变化的问题;
- 使用
CreateProcess时,若路径含空格,需要给文件名加引号(比如L"\"C:\\Program Files\\Game.exe\""); - 遍历进程需要足够权限,部分系统进程可能无法访问。
内容的提问来源于stack exchange,提问作者user18126130
相关产品推荐
相关产品推荐

