C# 无法从GetProcessId(…hWnd)(pInvoke)提取processID

C# 无法从GetProcessId(…hWnd)(pInvoke)提取processID,c#,process,automation,pinvoke,handle,C#,Process,Automation,Pinvoke,Handle,我使用下面的方法 要尝试获取正在运行的进程的processId,我只有HWND信息。我的问题是它总是返回错误代码6,这是错误无效的句柄。我想我可能会将参数更改为int类型,但这也不起作用。我无法枚举正在运行的进程,因为一次可能有多个实例在运行 有人能看出我做错了什么吗 注意:这个过程是从一个向框架公开的自动化对象派生出来的,并且只提供HWND属性。也许有另一种方法可以让processID看到我编写的代码首先负责运行它 我的代码看起来与此类似 自动化应用程序 extApp=new Automati

我使用下面的方法

要尝试获取正在运行的进程的processId,我只有HWND信息。我的问题是它总是返回错误代码6,这是错误无效的句柄。我想我可能会将参数更改为int类型,但这也不起作用。我无法枚举正在运行的进程,因为一次可能有多个实例在运行

有人能看出我做错了什么吗

注意:这个过程是从一个向框架公开的自动化对象派生出来的,并且只提供HWND属性。也许有另一种方法可以让processID看到我编写的代码首先负责运行它

我的代码看起来与此类似

自动化应用程序 extApp=new AutomationApplication.Application(); extApp.Run()


什么是“AutomationApplication.Application”类?是你写的吗?.Run()是否返回PID?

请参阅,无需调用WIN32,因为您可以使用托管API:

替代托管API: System.Diagnostics.Process类包含许多模块、进程和线程方法

例如:

获取给定进程句柄而不是窗口句柄时的进程ID。实际上是:

[DllImport("kernel32", SetLastError = true)]
static extern int GetProcessId(IntPtr hProcess);
如果您有一个窗口句柄,那么您需要该函数:

[DllImport("user32")]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);

这将返回线程id,并将进程id放入out参数。

它实际上是用于AutoCad的,所以我没有编写它。好的,选项(可能是lame)是调用“System.Diagnostics.process.GetCurrentProcess();”检查每个属性的“.Handle”属性?啊,多亏了你的建议,我才有了突破,我发现HWND属性公开了主窗口句柄,我可以对照进程类信息进行交叉检查。谢谢您真的认为所有系统进程上的双嵌套循环都比win32调用好吗?指出了一种可能性。从开始做一些研究。始终测量对特定情况非常重要的参数(可读性、速度、内存占用等)。
[DllImport("kernel32", SetLastError = true)]
static extern int GetProcessId(IntPtr hProcess);
[DllImport("user32")]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);