2

我使用以下方法

    [DllImport("kernel32.dll", SetLastError=true)]
    static extern int GetProcessId(IntPtr hWnd);

尝试获取正在运行的进程的 processId,我拥有的唯一信息是 HWND。我的问题是它总是返回错误代码 6,即 ERROR_INVALID_HANDLE。我想我可能会将参数更改为 int 类型,但这也没有用。我无法枚举正在运行的进程,因为任何时候都可能有超过 1 个实例在运行。

谁能看看我做错了什么?

注意:该进程是从暴露给框架的自动化对象产生的,并且仅提供 HWND 属性。也许还有另一种方法可以让 processID 看到,因为我编写的代码首先负责运行它?

我的代码看起来与此类似...

AutomationApplication.Application extApp = new AutomationApplication.Application(); extApp.Run(); ...

4

3 回答 3

11

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 放入输出参数中。

于 2009-08-16T06:56:24.860 回答
1

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

于 2009-08-16T06:04:17.090 回答
0

请参阅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);
            }
        }
    }
}
于 2009-08-16T06:50:39.023 回答