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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:07:20