Как получить объект COM из HWND в Win32 :: OLE? - PullRequest
2 голосов
/ 02 ноября 2009

В Perl, если у меня HWND объекта окна, как я могу получить доступ к этому COM-объекту, используя этот дескриптор? Я посмотрел на Win32 :: OLE, но самым близким был метод GetActiveObject, который ожидает класс.

Ответы [ 3 ]

2 голосов
/ 06 ноября 2009

Не существует стандартного способа получения указателя интерфейса COM от HWND, потому что окно не является объектом COM. Базовый Windows API, включая дескрипторы окон, предшествовал изобретению OLE и COM. Реализация конкретного окна может предоставлять некоторые или все его функциональные возможности через интерфейсы COM, но эти интерфейсы будут зависеть от приложения.

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

2 голосов
/ 02 ноября 2009

Получите HWND или местоположение из Доступного объекта и управляйте им с помощью Windows API:

use Win32::GuiTest;

используйте HWND

my $hwnd = $ao->WindowFromAccessibleObject();
my $name = Win32::GuiTest::GetWindowText($hwnd);
0 голосов
/ 06 ноября 2009

Если вы хотите получить интерфейс IAccessible от HWND, вы можете попробовать использовать WM_GETOBJECT (примечание: я предполагаю, что есть возможность отправлять оконные сообщения в Perl - хорошо известно нет знаний Perl).

Не все так делают, поэтому убедитесь, что вы как-то справляетесь со сбоями. Например, Internet Explorer предоставляет WM_HTML_GETOBJECT для получения указателя IHTMLDocument2.

...