Search code examples
c#.net-4.0processpid

Process started by Process.start() returns incorrect process ID?


I am starting an executable using this code:

Process proc = new Process();
proc.StartInfo.FileName = executablePath;
proc.Start();
proc.WaitForInputIdle();

after this calling proc.Id it gives me some integer, which is not real process ID. In the task manager there is another ID for this process and also I am using MS UI Automation to access this application, which also returns the same ID as in task manager. So my question is how can I get the real process ID of started process?

UPDATE

I found out that on Windows 7 it works fine and returns me the right ID, but not on Windows XP. What can be the reason?

SCENARIO

The scenario of the application is the following. I have a running embedded HTTP server, which is implemented not by me, (here is the source). The client connects to the web server and sends a request to run a program. In the request handler of my server I am just using Process.start() to start the requested application. As a web server the program creates threads for every client session connected to it (I assume so, as I didn't wrote it). Can this somehow help to identify the problem as it exists only on Windows XP X86 Service Pack 3?


Solution

  • An example of how I did it:

        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;
        }
    

    Otherwise, try using handles like this:
    Using handlers
    Getting handler

    hWnd = (int) process.MainWindowHandle;
    int processId;
    GetWindowThreadProcessId(hWnd, out processId);
    
    [DllImport("user32")]
    static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);
    

    Side note:
    What happens if you get the array of process and iterate over them and compare the PIDs?

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