Почему AccessibleObjectFromWindow () работает только в приложениях Microsoft Office? - PullRequest
1 голос
/ 13 июня 2019

Я пытаюсь получить COMObject уже запущенного приложения. Мне удалось получить hwnd и после запуска AccessibleObjectFromWindow с правильными параметрами я получаю ошибку:

OSError: [WinError -2147467259] Unspecified error

Когда я запускаю тот же сценарий, используя правильный hwnd для Microsoft Word или Excel, он работает.

Пример кода, который получает hwnd приложения, перебирает все дочерние элементы и пытается запустить AOFW. Я перебираю всех возможных потомков, потому что знаю в Word или Excel, что согласно этому вопросу , есть доступное окно, которое нужно использовать вместо всего родительского hwnd.

import win32gui
from ctypes import oledll
from ctypes import byref

#installed by easy_install comtypes
from comtypes import POINTER
from comtypes.automation import IDispatch
import comtypes.client.dynamic as comDy

#obtain hwnd of application
hwnd = win32gui.FindWindow(None, "CATIA V5")

def winfun(hwnd, lparam):
    allHwnd.append(hwnd)
#naughty global variable
allHwnd = []
#call winfun to populate allHwnd with all the child hwnds
win32gui.EnumChildWindows(hwnd, winfun, None)

for childHwnd in allHwnd:
    OBJID_NATIVEOM = -16
    p = POINTER(IDispatch)()
    try:
        oledll.oleacc.AccessibleObjectFromWindow(childHwnd, OBJID_NATIVEOM, byref(IDispatch._iid_), byref(p))
        window = comDy.Dispatch(p)
        CATIA = window.application
        print('winner winner hwnd: '+str(childHwnd))
        print(CATIA)
    except:
        print('No dice')
#lots of 'No dice' printed with one successful COMObject when the application is Word or Excel.
#only lots of 'No Dice' when running on everything else

Я пробовал несколько приложений, и единственное, у которого есть дочерний элемент, который может инициировать отложенный COMObject, - это приложения Microsoft Office. все остальное печатает много «No Dice»

Разве невозможно получить COMObject уже развернутого приложения?

H

...