有没有办法通过以下方式获取Steam游戏的进程名称/ ID:
Process.Start("steam://rungameid/#");
正如所料,上述方法返回Steam.exe。
答案 0 :(得分:2)
每个游戏都在HKCU\SOFTWARE\Valve\Steam\Apps
您应该可以从那里检查游戏的Installed
值,然后使用steam://rungameid/#
运行游戏,然后等待Running
或Updating
值将更改为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;}名称(未经测试)。