我使用以下方法

    [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);
            }
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top