获取进程的PID由Process.start()启动

hay*_*nar 22 c# pid process .net-4.0

我正在使用此代码启动可执行文件:

Process proc = new Process();
proc.StartInfo.FileName = executablePath;
proc.Start();
proc.WaitForInputIdle();
Run Code Online (Sandbox Code Playgroud)

在这个调用之后proc.Id它给了我一些整数,这不是真正的进程ID.在任务管理器中,此进程还有另一个ID,我也使用MS UI Automation访问此应用程序,该应用程序也返回与任务管理器中相同的ID.所以我的问题是如何获得启动过程的真实进程ID?

UPDATE

我发现在Windows 7上它工作正常并返回正确的ID,但不是在Windows XP上.可能是什么原因?

情景

该应用程序的场景如下.我有一个正在运行的嵌入式HTTP服务器,它不是由我实现的(这里是源代码).客户端连接到Web服务器并发送运行程序的请求.在我的服务器的请求处理程序中,我只是Process.start()用来启动请求的应用程序.作为Web服务器,程序为连接到它的每个客户端会话创建线程(我假设如此,因为我没有写它).这可以以某种方式帮助识别问题,因为它只存在于Windows XP X86 Service Pack 3上吗?

Mar*_*cus 23

我是如何做到的一个例子:

    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;
    }
Run Code Online (Sandbox Code Playgroud)

否则,尝试使用这样的句柄:
使用处理程序
获取处理程序

hWnd = (int) process.MainWindowHandle;
int processId;
GetWindowThreadProcessId(hWnd, out processId);

[DllImport("user32")]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);
Run Code Online (Sandbox Code Playgroud)

旁注:
如果获得进程数组并迭代它们并比较PID,会发生什么?

Process[] p = Process.GetProcessesByName( "testprogram" );
foreach(var proc in p)
    Console.WriteLine("Found: "+proc.Id == myExpectedProcId);
Run Code Online (Sandbox Code Playgroud)


Age*_*ire 6

这个:

using (Process process = Process.Start("notepad.exe"))
{
    process.WaitForInputIdle();
    Console.WriteLine(process.Id);
}
Run Code Online (Sandbox Code Playgroud)

实际上对我有用:

http://pasteboard.s3.amazonaws.com/images/1350293463417532.png

任务管理器:

http://pasteboard.s3.amazonaws.com/images/1350293536498959.png

我的想法:

实际上你的过程开始另一个过程,正试图获得某种启动器的ID.(它可以顺便开始).