java - JACOB获得窗口的HWND

我正在寻找使用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的新手。无论哪种方式,我都应该如何使用JACOB来获取Powerpoint窗口的HWND?

最佳答案

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

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


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


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

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

Dispatch.get(window, 0x7e4);


我建议您尝试一下。

本文翻译自 https://stackoverflow.com/questions/17665261/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 java com hwnd jacob


相关文章:

java - 如何为多个Java Web项目使用公共库

java - Log4j:如何撰写配置?

c# - 通过PIA接口类型获取CLSID

python - PyQt将PuTTY / KiTTY嵌入到应用程序中-无法删除边框

java - 将POJO转换为<K,V>地图[重复]

java - JPA query.getResultList()返回错误的对象?

c# - 从MemoryStream运行Microsoft Excel应用程序

c++ - 在C ++中托管Silverlight

c++ - “ hInstance”未定义。 C ++ WIN32应用程式

wpf - Qt QML组件,如WPF HwndHost