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

C# 通过启动Steam游戏后获取进程Id或进程名称steam://rungameid/#,c#,steam,C#,Steam,是否有办法通过以下方式获取Steam游戏的进程名称/id: Process.Start("steam://rungameid/#"); 正如预期的那样,上面的方法返回Steam.exe。通常情况下,no Steam只是使用一个自定义URI前缀,它允许您指定哪个应用程序将为该请求提供服务。但它不会为每个游戏创建一个新的前缀,而是由steam.exe处理,它决定实际运行哪个应用程序 Steam本身当然会跟踪它运行的游戏,但我假设它只是跟踪它们的进程ID,可能会受到Steam集成或Steam覆盖注入

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

Process.Start("steam://rungameid/#");
正如预期的那样,上面的方法返回Steam.exe。

通常情况下,no

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

Steam本身当然会跟踪它运行的游戏,但我假设它只是跟踪它们的进程ID,可能会受到Steam集成或Steam覆盖注入的一些影响,以跟踪使用启动器的游戏。我认为,如果您不愿意与其他应用程序的私密性发生冲突,就没有任何简单的方法来保存这些信息

在某些情况下,您可能有其他解决方案;e、 g.如果您不介意可能同时运行多个Steam游戏,您可以尝试查找所有具有Steam覆盖的进程,但这些进程非常具体-它们可能对您很有效,但对其他用户无效。

一般来说,不会

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

Steam本身当然会跟踪它运行的游戏,但我假设它只是跟踪它们的进程ID,可能会受到Steam集成或Steam覆盖注入的一些影响,以跟踪使用启动器的游戏。我认为,如果您不愿意与其他应用程序的私密性发生冲突,就没有任何简单的方法来保存这些信息


在某些情况下,您可能有其他解决方案;e、 g.如果您不介意同时运行多个Steam游戏,您可以尝试查找所有具有Steam覆盖的进程,但这些进程非常具体-它们可能对您很有效,但对其他用户无效。

因为新进程不会作为Steam的子进程启动,不可能派生出它的id。但是您可以尝试派生当前正在运行的游戏,然后在所有正在运行的进程中搜索它们的名称。API应通过
gameextrainfo
属性公开游戏名称,该属性应与进程名称相同(但未测试)。

因为新进程不会作为steam的子进程启动,不可能派生出它的id。但是您可以尝试派生当前正在运行的游戏,然后在所有正在运行的进程中搜索它们的名称。API应通过
gameextrainfo
属性公开游戏名称,该属性应与进程名称相同(但未经测试)。

每个游戏在注册表中的
HKCU\SOFTWARE\Valve\Steam\Apps

您应该能够从那里检查游戏的
安装值
,然后使用
steam://rungameid/#
,然后等待
运行
更新
值更改为
1
,然后再次等待
0


这使得跟踪游戏执行成为可能,但是,您仍然无法直接获得游戏的进程id。

每个游戏在注册表中的
HKCU\SOFTWARE\Valve\Steam\Apps下都有一个键。

您应该能够从那里检查游戏的
安装值
,然后使用
steam://rungameid/#
,然后等待
运行
更新
值更改为
1
,然后再次等待
0


这使得跟踪游戏执行成为可能,但是,您仍然无法直接获得游戏的进程id。

这是一个老问题,但我刚刚做了同样的事情(对于一个与您正在处理的项目有点类似的项目)。您可以使用System.Management中的ManagementObjects查找进程的父ID。如果您正在启动Steam,您将拥有Steam的进程Id,尽管您当前启动游戏的方式是,您将需要查找Steam的进程Id

你会发现,每个游戏通常会产生2-3个不同的子进程。蒸汽覆盖,网络客户端,然后是游戏本身(可能还有另一个游戏的启动器)。但是,它们都应该是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
            }
        }
    }
}
List procs=Process.getprocesss();
processsteam=procs.Find(x=>x.ProcessName==“steam”);
int-steamId=steam.Id;
foreach(var proc in procs)
{
使用(ManagementObject mo=newmanagementobject($“win32_process.handle='{proc.Id}'))
{
如果(mo!=null)
{
尝试
{
mo.Get();
int parentPid=Convert.ToInt32(mo[“ParentProcessId”]);
if(parentPid==steamId)
{
WriteLine($“{proc.ProcessName}作为{mo[“ParentProcessId”]}的子级运行);
}
}
捕获(例外情况除外)
{
//该过程在轮询所有进程和请求管理对象之间结束
}
}
}
}

这是一个老问题,但我刚刚做了同样的事情(对于一个与您正在进行的工作有点类似的项目)。您可以使用System.Management中的ManagementObjects查找进程的父ID。如果您正在启动Steam,您将拥有Steam的进程Id,尽管您当前启动游戏的方式是,您将需要查找Steam的进程Id

你会发现,每个游戏通常会产生2-3个不同的子进程。蒸汽覆盖层