有人可以告诉我,如果我已经知道句柄,我如何使用进程类捕获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呢?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top