Search code examples
c#processhandle

Get running process given process handle


can someone tell me how i can capture a running process in c# using the process class if i already know the handle?

Id rather not have not have to enumerate the getrunning processes method either. pInvoke is ok if possible.


Solution

  • In plain C#, it looks like you have to loop through them all:

    // IntPtr myHandle = ...
    Process myProcess = Process.GetProcesses().Single(
        p => p.Id != 0 && p.Handle == myHandle);
    

    The above example intentionally fails if the handle isn't found. Otherwise, you could of course use SingleOrDefault. Apparently, it doesn't like you requesting the handle of process ID 0, hence the extra condition.

    Using the WINAPI, you can use GetProcessId. I couldn't find it on pinvoke.net, but this should do:

    [DllImport("kernel32.dll")]
    static extern int GetProcessId(IntPtr handle);
    

    (signature uses a DWORD, but process IDs are represented by ints in the .NET BCL)

    It seems a bit odd that you'd have a handle, but not a process ID however. Process handles are acquired by calling OpenProcess, which takes a process ID.