题
有人可以告诉我,如果我已经知道句柄,我如何使用进程类捕获C#中的运行过程?
ID宁愿也不必列举Getrunning流程方法。如果可能的话,可以。
解决方案
在普通的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由 int
.net bcl中的s)
您有一个句柄似乎有些奇怪,但没有一个过程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;
}
}
.NET API似乎没有简单的方法来执行此操作。问题是,您从哪里得到的?如果以相同的方式可以访问流程ID,则可以使用:
Process.GetProcessById (int iD)
您可以使用GetWindowThreadProcessid Winapi Call
http://www.pinvoke.net/default.aspx/user32/getWindowThreadProcessid.html
要获取流程ID-然后使用该过程获取一个过程对象.....
但是,为什么不想列举运行过程的ID呢?
不隶属于 StackOverflow