获取给定进程句柄的运行进程

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

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

在普通的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获取进程句柄, OpenProcess获取进程ID。

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

似乎没有简单的方法可以通过.Net API执行此操作。 问题是,你从哪里获得了这个处理? 如果您可以通过相同的方式访问进程ID,则可以使用:

Process.GetProcessById (int iD)

您可以使用GetWindowThreadProcessId WinAPI调用

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

要获取进程ID – 然后使用它获取一个Process对象…..

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