9

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

我宁愿也不必枚举 getrunning processes 方法。如果可能,pInvoke 是可以的。

4

4 回答 4

10

在普通的 C# 中,看起来你必须遍历它们:

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

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

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

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

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

您有一个句柄,但没有进程 ID,这似乎有点奇怪。进程句柄是通过调用 获取的OpenProcess,它需要一个进程 ID。

于 2009-08-14T08:16:53.793 回答
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;
    }
}
于 2009-08-14T08:18:01.233 回答
1

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

Process.GetProcessById (int iD)

于 2009-08-14T08:19:48.000 回答
0

您可以使用 GetWindowThreadProcessId WinAPI 调用

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

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

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

于 2009-08-14T08:26:15.537 回答