JACOB获取窗口的HWND

时间:2013-07-15 22:53:42

标签: java com hwnd jacob

我希望使用Java / JACOB获取powerpoint窗口的本机Window句柄。 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?

1 个答案:

答案 0 :(得分:3)

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

interop程序集中的元数据显示COM接口中实际存在一个未记录的HWND属性到DocumentWindow,但它带有特殊类型库属性FUNCFLAG_FRESTRICTED { {3}}它

  

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

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

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

Dispatch.get(window, 0x7e4);

我建议你试一试。