【问题标题】:Unable to extract processID from GetProcessId(.. hWnd) (pInvoke)无法从 GetProcessId(..hWnd) (pInvoke) 中提取 processID
【发布时间】:2009-08-16 06:02:04
【问题描述】:

我用下面的方法

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

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

谁能看看我是不是做错了什么?

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

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

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

【问题讨论】:

    标签: c# process automation pinvoke handle


    【解决方案1】:

    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。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 它实际上是用于 AutoCad,所以不是我没有写的。
      • 好吧,选项,可能是蹩脚的,是调用'System.Diagnostics.Process.GetCurrentProcess();'并检查每个的“.Handle”属性?
      • 啊,感谢您的建议,我刚刚取得了突破,我发现 HWND 属性公开了主窗口句柄,我可以对照进程类信息进行交叉检查。谢谢!
      【解决方案3】:

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

      【讨论】:

      • 真的认为所有系统进程上的这种双重嵌套循环都比win32调用更好吗?
      • 指向一种可能性。从stackoverflow.com/questions/3368802/… 开始做一些研究。始终测量对特定情况很重要的参数(可读性、速度、内存占用……)。
      猜你喜欢
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      相关资源
      最近更新 更多