无法从GetProcessId(.. hWnd)中提取processID(pInvoke)

时间:2009-08-16 06:02:04

标签: c# process automation pinvoke handle

即时使用以下方法

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

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

有谁能看出我做错了什么?

注意:该进程是从暴露给框架的自动化对象中生成的,只提供HWND属性。也许还有另一种方法来获取processID,因为我编写的代码首先负责运行它?

我的代码与此类似......

  

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

3 个答案:

答案 0 :(得分: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放在out-param中。

答案 1 :(得分:1)

什么是'AutomationApplication.Application'类?你写的那个吗? .Run()是否返回PID?

答案 2 :(得分:0)

查看example on 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);
            }
        }
    }
}