直接启动一个具有多进程的游戏。
等也不等直接使用 Process.GetProcessesByName()
毫无疑问 c#太快了,只获取到一个。实际上人家启动完后有四五个进程。
PS C:\Users\k1mlka> tasklist | findstr Game.exe
Game.exe 4300 Console 1 57,472 K
Game.exe 2388 Console 1 8,540 K
Game.exe 5908 Console 1 8,212 K
Game.exe 10324 Console 1 58,916 K
Game.exe 2280 Console 1 182,588 K
使用 WaitForInputIdle(7000)
去等待进程先启动,结果用 0.135894 就卡完了。(大都100-200ms间)这次Process.GetProcessesByName()
倒是给我找到了俩个进程,这也还不是全部。看样子这些进程怕不是一个调用一个出现的。
(并不绝对)
把WaitForInputIdle 等待时长使劲调小,最小为0,-1就无限期等待了。
返回值是false,这是还未等待完的意义。返回True就是不阻塞io了。
也许可以让所有进程都走一遍WaitForInputIdle 来实现以最快的方式准确的获取所有进程。
True 就加载完,False还在等。超过7秒就报错。大致思路就是,获得Proceses-> 全跑WaitForInputIdle -> 再探有无新Proc,没有就结束,有就再跑新的。这个方法也不会影响使不使用LE,更犯不着改LE源码,让程序返回PID给你。
再测试一下所有进程的MainWinHandle情况
程序使用WaitForInputIdle找到所有进程。
对每一个进程都走一遍WaitForInputIdle,其中时间最长的那个大概率是含有窗口handle的进程。
但是窗口明明都已经出来了,最后那一进程还是被WaitForInputIdle卡住不知是何原因。甚至不关游戏不会停。项目里从没遇到过这情况.
bool newProcFlag;
do
{
newProcFlag = false;
ProcList.Clear();
foreach (Process p in Process.GetProcessesByName("Game"))
{
ProcList.Add(p);
if (!dict.ContainsKey(p.Id))
dict.Add(p.Id, false);
if (dict[p.Id] == false)
{
Console.WriteLine($"新进程{p.Id}");
if (p.WaitForInputIdle(7000) == false)
{
Console.WriteLine("Error");
//return;
}
dict[p.Id] = true;
newProcFlag = true;
}
}
} while (newProcFlag);
// Result
foreach(var p in ProcList)
{
Console.WriteLine($"{p.Id} {p.MainWindowHandle}");
}
得出的结论是,有些进程会无限卡住,还不一定是窗口线程。
但是handle还是有了的。主要还是依据handle数值来判断吧。
再续...
网友评论