无法从getProcessid(.. hwnd)(pinvoke)提取ProcessID
-
16-09-2019 - |
题
我使用以下方法
[DllImport("kernel32.dll", SetLastError=true)] static extern int GetProcessId(IntPtr hWnd);
尝试获取运行过程的过程ID,而我唯一的信息就是HWND。我的问题是它总是返回错误代码6,即error_invalid_handle。我以为我可能会将参数更改为INT类型,但这也无效。我无法列举运行过程,因为一次可能有1个以上的实例。
谁能看看我是否做错了什么?
NB:该过程是从暴露于该框架的自动化对象产生的,并且仅提供HWND属性。也许还有另一种方法可以使ProcessID看到,因为我编写的代码首先负责运行它?
我的代码看起来与此相似...
AutomationApplication.Application Extapp = new AutomationApplication.Application(); Extapp.run(); ...
解决方案
什么是“ automationapplication.application”类?你写的吗? .run()返回pid吗?
其他提示
getProcessid 在给出过程句柄时获取过程ID,而不是窗口句柄。实际上是:
[DllImport("kernel32", SetLastError = true)]
static extern int GetProcessId(IntPtr hProcess);
如果您有一个窗口句柄,那么您想要 getWindowThreadProcessID 功能:
[DllImport("user32")]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);
这将返回线程ID,并将过程ID放在外部。
看 pinvoke上的示例, ,不需要 WIN32
致电,因为您可以使用托管API:
替代托管API:System.diagnostics.process类包含许多模块,过程和线程方法。
例如:
using System.Diagnostics;
...
private void DumpModuleInfo(IntPtr hProcess)
{
uint pid = GetProcessId(hProcess);
foreach (Process proc in Process.GetProcesses())
{
if (proc.Id == pid)
{
foreach (ProcessModule pm in proc.Modules)
{
Console.WriteLine("{0:X8} {1:X8} {2:X8} {3}", (int)pm.BaseAddress,
(int)pm.EntryPointAddress, (int)pm.BaseAddress + pm.ModuleMemorySize, pm.ModuleName);
}
}
}
}
不隶属于 StackOverflow