获取运行流程给定流程处理

时间:2009-08-14 08:11:23

标签: c# process handle

如果我已经知道句柄,有人可以告诉我如何使用进程类在c#中捕获正在运行的进程吗?

Id而不是也不必枚举getrunning流程方法。如果可能的话,pInvoke就可以了。

4 个答案:

答案 0 :(得分:9)

在简单的C#中,看起来你必须遍历所有这些:

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

如果找不到句柄,上面的例子故意失败。否则,您当然可以使用SingleOrDefault。显然,它不喜欢您请求进程ID 0的句柄,因此是额外的条件。

使用WINAPI,您可以使用GetProcessId。我在pinvoke.net上找不到它,但是应该这样做:

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

(签名使用DWORD,但进程ID由.NET BCL中的int表示)

你有一个句柄似乎有点奇怪,但不是一个进程ID。通过调用OpenProcess获取进程句柄,该{{3}}获取进程ID。

答案 1 :(得分:3)

using System.Diagnostics;

class ProcessHandler {
    public static Process FindProcess( IntPtr yourHandle ) {
        foreach (Process p in Process.GetProcesses()) {
            if (p.Handle == yourHandle) {
                return p;
            }
        }

        return null;
    }
}

答案 2 :(得分:1)

.Net API似乎没有简单的方法来做到这一点。问题是,你从哪里得到了这个句柄?如果您可以通过相同的方式访问进程ID,则可以使用:

Process.GetProcessById (int iD)

答案 3 :(得分:0)

您可以使用GetWindowThreadProcessId WinAPI调用

http://www.pinvoke.net/default.aspx/user32/GetWindowThreadProcessId.html

获取进程ID - 然后使用它获取Process对象.....

但是你为什么不想枚举正在运行的进程的id?