【问题标题】:JACOB get HWND of windowJACOB 获取窗口的 HWND
【发布时间】:2013-07-13 23:13:59
【问题描述】:

我正在寻找使用 Java / JACOB 的 powerpoint 窗口的本机窗口句柄。 MSDN documentation 似乎表明应该可以只获取“HWND”属性,所以我正在尝试这样:

app = new ActiveXComponent("PowerPoint.Application");
Dispatch presentations = app.getProperty("Presentations").toDispatch();
presentation = Dispatch.call(presentations, "Open", fileLocation).toDispatch();
EnumVariant windows = new EnumVariant(Dispatch.get(presentation, "Windows").toDispatch());
Dispatch window = windows.nextElement().toDispatch();
Dispatch.get(window, "HWND"); //Exception here

但是,我似乎无法通过这种方式获取窗口句柄 - 我收到以下错误:

Exception in thread "main" com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: HWND
Description: 80020003 / Member not found.

at com.jacob.com.Dispatch.invokev(Native Method)
at com.jacob.com.Dispatch.invokev(Dispatch.java:625)
at com.jacob.com.Dispatch.get(Dispatch.java:788)
at tester.PowerpointSlideShowRunner.<init>(PowerpointSlideShowRunner.java:54)
at tester.PowerpointSlideShowRunner.main(PowerpointSlideShowRunner.java:154)

这是库中的错误,还是我在这里做错了什么/误解了什么?后者很有可能,因为我对雅各布完全陌生。无论哪种方式,我应该如何使用 JACOB 获取 Powerpoint 窗口的 HWND?

【问题讨论】:

  • “MSDN 文档似乎建议...”:什么 MSDN 文档?据我所知,不是 PowerPoint 对象模型文档:msdn.microsoft.com/en-us/library/ff744694.aspx
  • @ChrisDickson 我实际上正在查看我刚刚更新问题的链接,但我可能一直在寻找错误的地方,对此感到抱歉!如果是这样,那么您知道如何以其他方式最好地获取 HWND 吗?

标签: java com hwnd jacob


【解决方案1】:

您链接的 MSDN 文档适用于 .NET 互操作程序集,它包装了 PowerPoint COM 对象模型以供 .NET 托管代码使用,而不是用于 COM 对象模型本身。

互操作程序集中的元数据显示,在DocumentWindow 的 COM 接口中实际上存在一个未记录的 HWND 属性,但它带有特殊类型库属性 FUNCFLAG_FRESTRICTED 其中 indicates that

适用于系统级函数或键入浏览器的函数 不应该显示。

我想这就是您尝试通过 DocumentWindow 调度接口按名称调用此属性失败的原因。

但是,Interop 程序集元数据还显示此受限属性的 DISPID(调度标识符)是值 0x7e4。我对 JACOB 库不是很熟悉,但我相信有一个覆盖可以让您通过 DISPID 而不是通过名称获取属性的值:

Dispatch.get(window, 0x7e4);

我建议你试试这个。

【讨论】:

  • 谢谢,这个 DISPID 确实给了我一个对象 - 但不幸的是,它没有直接给我 HWND int,它似乎包含两个 DISPID - 0x1 和 0x4。 1 再次给了我对演示窗口的引用,4 给了我一个 int 但它似乎总是 34,而不是窗口句柄。有什么想法吗?
  • “它似乎包含两个 DISPID”......我不明白你在说什么。返回的对象是Variant:它的底层类型是什么(getvt())?
  • 对不起,应该更清楚。底层类型是Dispatchgetvt() 返回 9),所以我可以通过getDispatch() 抓取 Dispatch 对象。我不确定这个特定 Dispatch 的类型,并且循环通过 DISPID 似乎只产生两个,0x1 和 0x4。如果我调用 0x1(通过Dispatch.get(hwnd, 0x1) 假设 hwnd 是我从上面调用 0x7e4 得到的调度),那么我会得到一个返回的调度,它等于窗口对象,如果我调用 0x4,那么我会得到一个返回的整数,它似乎总是34(据我所知,这不是 HWND。)
猜你喜欢
  • 2013-01-17
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
相关资源
最近更新 更多