【问题标题】:How do I get the COM object from a HWND in Win32::OLE?如何从 Win32::OLE 中的 HWND 获取 COM 对象?
【发布时间】:2009-11-01 22:46:40
【问题描述】:

在 Perl 中,如果我有一个窗口对象的 HWND,我如何使用该句柄访问该 COM 对象?我查看了 Win32::OLE,但我得到的最接近的是 GetActiveObject 方法,它需要一个类。

【问题讨论】:

  • 我正在使用 AutoIt 在我们广泛的 Perl 自动化框架中包含一些 win32 应用程序自动化。 AutoIt 方便地提供了通过任何语言访问它的 activex 控件,这就是我正在使用的。现在,为了附加到现有的应用程序实例,如 IE,AutoIt 已经有它的本机脚本,但我试图在 Perl 中复制它。 AutoIt 提供的方法之一是 ControlGetHandle,它将为您提供您感兴趣的特定应用程序窗口的现有实例的 HWND。但现在我需要访问它的 COM 对象。希望这能澄清我正在尝试做的事情。

标签: perl winapi ole


【解决方案1】:

没有从 HWND 获取 COM 接口指针的标准方法,因为窗口不是 COM 对象。包括窗口句柄在内的基本 Windows API 早于 OLE 和 COM 的发明。特定窗口的实现可能会通过 COM 接口公开其部分或全部功能,但这些接口将是特定于应用程序的。

如果记录了您要控制的窗口公开了一个公共 COM 接口,该窗口的文档还将告诉您如何在窗口中查询接口指针。最有可能的是,它需要发送一个特定于应用程序的window message

【讨论】:

    【解决方案2】:

    从可访问对象中获取 HWND 或位置并使用 Windows API 对其进行操作:

    use Win32::GuiTest;
    

    使用 HWND

    my $hwnd = $ao->WindowFromAccessibleObject();
    my $name = Win32::GuiTest::GetWindowText($hwnd);
    

    【讨论】:

    • 不完全是我要找的东西,但我认为这引导我朝着正确的方向前进,我将阅读文档以查看是否可以获得指向 COM 对象的指针。谢谢。
    【解决方案3】:

    如果您希望从 HWND 获取 IAccessible 接口,您可以尝试使用 WM_GETOBJECT(注意:我假设在 Perl 中有某种方式可以发送窗口消息 — 众所周知,我没有 Perl 知识) .

    不是每个人都这样做,所以一定要以某种方式处理失败。例如,Internet Explorer 公开 WM_HTML_GETOBJECT 以获取 IHTMLDocument2 指针。

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多