有没有办法获取通过以下方式启动的Steam游戏的进程名称/id:
Process.Start("steam://rungameid/#");不出所料,上述方法返回Steam.exe。
发布于 2017-04-06 15:36:03
每个游戏在注册表的HKCU\SOFTWARE\Valve\Steam\Apps下都有一个注册表项
您应该能够从那里检查游戏的Installed值,然后使用steam://rungameid/#运行游戏,然后等待Running或Updating值更改为1,然后再次等待0。
这使得跟踪游戏执行成为可能,但是,您仍然不能直接获得游戏的进程id。
发布于 2018-03-31 12:03:17
这是一个古老的问题,但我刚刚做完了同样的事情(对于一个与您正在工作的项目有点相似的项目)。您可以使用System.Management中的ManagementObjects来查找进程的ParentId。如果您正在启动Steam,您将拥有Steam的进程Id,尽管按照您当前启动游戏的方式,您将需要查找Steam的进程Id。
你会发现每个游戏通常会产生2-3个不同的子进程。steam覆盖,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
}
}
}
}发布于 2017-03-07 23:31:39
一般来说,不是。
Steam只使用一个自定义URI前缀,它允许您指定哪个应用程序将为该请求提供服务。但是它不会为每个游戏创建一个新的前缀-相反,它是由steam.exe处理的,它决定实际运行什么应用程序。
Steam本身当然会跟踪它运行的游戏,但我假设它只是简单地跟踪它们的进程it,可能会受到Steam集成或Steam overlay注入的一些影响,以跟踪使用启动器的游戏。我不认为有任何简单的方法来保存这些信息,如果你不愿意摆弄其他应用程序的隐私。
在某些情况下,您可能有其他解决方案;例如,如果您不介意同时运行多个Steam游戏,您可以尝试查找具有Steam overlay的所有进程,但这些都是相当具体的-它们可能对您很有效,但对其他用户无效。
https://stackoverflow.com/questions/42651987
复制相似问题