我正在使用以下代码启动可执行文件:
Process proc = new Process();
proc.StartInfo.FileName = executablePath;
proc.Start();
proc.WaitForInputIdle();
在这次通话之后proc.Id
它给了我一些整数,这不是真正的进程ID。在任务管理器中,此进程有另一个 ID,而且我正在使用 MS UI 自动化来访问此应用程序,它也返回与任务管理器中相同的 ID。所以我的问题是如何获取启动进程的真实进程ID?
UPDATE
我发现在 Windows 7 上它工作正常并返回正确的 ID,但在 Windows XP 上却不行。可能是什么原因?
SCENARIO
应用场景如下。我有一个正在运行的嵌入式 HTTP 服务器,它不是由我实现的,(here http://www.codeproject.com/Articles/20445/C-Customizable-Embedded-HTTPServer是来源)。客户端连接到 Web 服务器并发送运行程序的请求。在我的服务器的请求处理程序中我只是使用Process.start()
启动所请求的应用程序。作为一个网络服务器,程序为连接到它的每个客户端会话创建线程(我假设是这样,因为我没有编写它)。这能否以某种方式帮助识别该问题,因为该问题仅存在于 Windows XP X86 Service Pack 3 上?
我是如何做到的的一个例子:
bool started = false;
var p = new Process();
p.StartInfo.FileName = "notepad.exe";
started = p.Start();
try {
var procId = p.Id;
Console.WriteLine("ID: " + procId);
}
catch(InvalidOperationException)
{
started = false;
}
catch(Exception ex)
{
started = false;
}
否则,尝试使用这样的句柄:
使用处理程序 https://stackoverflow.com/questions/1283564/unable-to-extract-processid-from-getprocessid-hwnd-pinvoke
获取处理程序 https://stackoverflow.com/questions/1421166/c-sharp-get-window-handle-after-starting-a-process
hWnd = (int) process.MainWindowHandle;
int processId;
GetWindowThreadProcessId(hWnd, out processId);
[DllImport("user32")]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);
边注:
如果获取进程数组并迭代它们并比较 PID,会发生什么?
Process[] p = Process.GetProcessesByName( "testprogram" );
foreach(var proc in p)
Console.WriteLine("Found: "+proc.Id == myExpectedProcId);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)