如果我已经知道句柄,有没有人能告诉我如何使用进程类(Process Class)在C#中捕获正在运行的进程?
我不想使用枚举(getrunning processes method)来获取进程。如果可能的话,可以使用pInvoke。
// IntPtr myHandle = ...
Process myProcess = Process.GetProcesses().Single(
p => p.Id != 0 && p.Handle == myHandle);
上面的示例在找不到句柄时会有意地失败。否则,你当然可以使用SingleOrDefault
。显然,它不喜欢你请求进程ID 0
的句柄,因此需要额外的条件。GetProcessId
。我在pinvoke.net上找不到它,但下面的代码可以用:[DllImport("kernel32.dll")]
static extern int GetProcessId(IntPtr handle);
(签名使用 DWORD
,但在.NET BCL中,进程ID由 int
表示)
然而,拥有句柄而没有进程ID似乎有点奇怪。调用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;
}
}
我长期以来一直在使用这些方法:
public static Process FindProcess(IntPtr handle) => FindProcess(p => p.Handle == handle);
public static Process FindProcess(int id) => FindProcess(p => p.Id == id);
public static Process FindProcess(string title) => FindProcess(p=> p.MainWindowTitle == title);
public static Process FindProcess(Func<Process,bool> comparer)
{
foreach (Process p in Process.GetProcesses())
if (comparer(p))
return p;
return null;
}
Enjoy...
似乎没有通过 .Net API 简单的方法来实现这个。问题是,你从哪里得到了那个句柄?如果你可以通过相同的方式获取进程 ID 的访问权限,你可以使用:
Process.GetProcessById(int iD)
http://www.pinvoke.net/default.aspx/user32/GetWindowThreadProcessId.html
获取进程 ID - 然后使用它获取一个进程对象.....
但是为什么不想枚举正在运行的进程的 ID 呢?
GetProcessId
是他所需要的。 - Thorarin