ДЖЕЙКОБ получает HWND окна

Я хочу получить собственный дескриптор окна окна PowerPoint с помощью Java / JACOB. Документация MSDN, похоже, предполагает, что можно просто захватить свойство «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)

Это ошибка в библиотеке, или я что-то делаю не так / что-то не понимаю? Последнее вполне возможно, поскольку я совершенно новичок в Джейкобе. В любом случае, как мне получить HWND окна Powerpoint с помощью JACOB?


person Michael Berry    schedule 15.07.2013    source источник
comment
Документация MSDN, кажется, предлагает ...: какая документация MSDN? Насколько я понимаю, это не документация по объектной модели PowerPoint: msdn.microsoft. ru / en-us / library / ff744694.aspx   -  person Chris Dickson    schedule 19.07.2013
comment
@ChrisDickson Я на самом деле смотрел ссылку, по которой только что обновил вопрос, но я мог искать не в том месте, извините за это! Если да, то есть ли у вас идеи, как лучше всего взять HWND другим способом?   -  person Michael Berry    schedule 20.07.2013


Ответы (1)


Связанная вами документация MSDN предназначена для сборки .NET Interop, которая обертывает объектную модель PowerPoint COM для использования управляемым кодом .NET, а не для самой объектной модели COM.

Метаданные в сборке взаимодействия показывают, что на самом деле существует недокументированное свойство HWND, присутствующее в интерфейсе COM для DocumentWindow, но оно несет в себе атрибут библиотеки специального типа FUNCFLAG_FRESTRICTED, который указывает, что это

предназначен для функций системного уровня или функций, которые браузеры типов не должны отображать.

Я полагаю, что это причина того, что ваша попытка вызвать это свойство по имени через диспетчерский интерфейс DocumentWindow терпит неудачу.

Однако метаданные сборки взаимодействия также показывают, что DISPID (идентификатор отправки) для этого ограниченного свойства - это значение 0x7e4. Я не очень знаком с библиотекой JACOB, но считаю, что есть переопределение, которое позволяет вам получать значение свойства по DISPID, а не по имени:

Dispatch.get(window, 0x7e4);

Я предлагаю вам попробовать.

person Chris Dickson    schedule 21.07.2013
comment
Спасибо, этот DISPID действительно возвращает мне объект, но тот, который, к сожалению, не дает мне HWND int напрямую, кажется, содержит два DISPID - 0x1 и 0x4. 1 снова дает мне ссылку на окно презентации, а 4 дает мне int, но всегда кажется 34, а не дескриптор окна. Любые идеи? - person Michael Berry; 22.07.2013
comment
кажется, он содержит два DISPID ... Я не понимаю, о чем вы здесь говорите. Возвращенный объект - Variant: каков его базовый тип (getvt())? - person Chris Dickson; 24.07.2013
comment
Извините, должно было быть яснее. Базовым типом является Dispatch (getvt() возвращает 9), поэтому я могу захватить объект Dispatch с помощью getDispatch(). Однако я не уверен в типе этой конкретной диспетчеризации, а цикл по идентификаторам DISPID, кажется, дает только два, 0x1 и 0x4. Если я вызываю 0x1 (через Dispatch.get(hwnd, 0x1), предполагая, что hwnd - это отправка, которую я получил от вызова 0x7e4 выше), тогда я получаю возвращенную отправку, равную объекту окна, если я вызываю 0x4, я получаю возвращенное целое число, которое всегда кажется 34 ( что, насколько я могу судить, не является HWND.) - person Michael Berry; 24.07.2013