通过steam:// rungameid /#启动Steam游戏后获取进程ID或进程名称

时间:2017-03-07 15:19:59

标签: c# steam

有没有办法通过以下方式获取Steam游戏的进程名称/ ID:

Process.Start("steam://rungameid/#");

正如所料,上述方法返回Steam.exe。

4 个答案:

答案 0 :(得分:2)

每个游戏都在HKCU\SOFTWARE\Valve\Steam\Apps

下的注册表中有一个密钥

您应该可以从那里检查游戏的Installed值,然后使用steam://rungameid/#运行游戏,然后等待RunningUpdating值将更改为1,并再次更改为0

这样可以跟踪游戏执行情况,但是,您仍然无法直接获得游戏的进程ID。

答案 1 :(得分:1)

一般来说,没有。

Steam只使用自定义URI前缀,它允许您指定将为该请求提供服务的应用程序。但它不会为每个游戏创建一个新的前缀 - 相反,它由steam.exe处理,它决定实际运行的应用程序。

蒸汽本身当然跟踪它运行的游戏,但我认为它只是跟踪他们的进程ID,可能受到Steam集成或Steam覆盖注入的一些影响,以跟踪使用启动器的游戏。如果你不愿意与其他应用程序的私有部分混在一起,我认为没有任何简单的方法来保存这些信息。

在某些情况下,您可能有其他解决方案;例如如果您不介意可能同时运行多个Steam游戏,您可以尝试查找具有Steam覆盖的所有进程,但这些进程相当具体 - 它们可能适合您,但对其他用户而言则失败。

答案 2 :(得分:1)

这是一个老问题,但我刚刚完成了同样的事情(对于一个与你正在进行的工作有点类似的项目)。您可以使用System.Management中的ManagementObjects来查找进程的ParentId。如果您要启动Steam,您将拥有Steam的流程ID,虽然您目前正在推出游戏,但您需要查找Steam的流程ID。

你会发现有一件事是每个游戏通常会产生2-3个不同的子进程。蒸汽覆盖,webclienthelper,然后游戏本身(可能是游戏发射器的另一个)。但是,他们都应该成为Steam流程的子项,并且所有这些都应该显示在找到的流程列表中。

它看起来像这样。

List<Process> procs = Process.GetProcesses();
Process steam = procs.Find(x => x.ProcessName == "Steam");
int steamId = steam.Id;

foreach (var proc in procs)
{
    using (ManagementObject mo = new ManagementObject($"win32_process.handle='{proc.Id}'"))
    {
        if (mo != null)
        {
            try
            {
                mo.Get();
                int parentPid = Convert.ToInt32(mo["ParentProcessId"]);
                if (parentPid == steamId)
                {
                    Console.WriteLine($"{proc.ProcessName} is running as a child to {mo["ParentProcessId"]}");
                }
            }
            catch (Exception ex)
            {
                // the process ended between polling all of the procs and requesting the management object
            }
        }
    }
}

答案 3 :(得分:0)

由于新流程不会作为子流程启动,因此无法获取其ID。您可以尝试的是派生当前正在运行的游戏via the API - 然后在所有正在运行的进程中搜索其名称。 API应通过gameextrainfo属性公开游戏的名称,该属性应与过程相同[&1;}名称(未经测试)。