java - JACOB 获取窗口的 HWND

标签 java com hwnd jacob

我正在寻找使用 Java/JACOB 获取 powerpoint 窗口的 native 窗口句柄。 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 对象模型本身。

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

is intended for system-level functions or functions that type browsers should not display.

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

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

Dispatch.get(window, 0x7e4);

我建议您尝试一下。

关于java - JACOB 获取窗口的 HWND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17665261/

相关文章:

java - HashMap 中的键映射到相同的值?

java - 使用算术/位运算符实现关系运算符

c++ - 当我的程序终止时,我应该总是在 COM 指针上调用 Release 吗?

C# 在线程之间编码 COM 对象

python win32 com 关闭itunes

java - JScrollPane - 新行上的多个图像

java - 使用套接字时,json 文件未完整到达

c++ - 如何最好地封装窗口句柄?

c++ - 如果 HWND 窗口仍然存在,我该如何确定

c++ - Qt、c++ QML 和 HWND