为什么AccessibleObjectFromWindow()只能在Microsoft Office应用程序上工作?

2024-03-28 10:11:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试获取已经运行的应用程序的COMObject。我已经能够获得hwnd,在使用正确的参数运行AccessibleObjectFromWindow之后,我得到了错误:

OSError: [WinError -2147467259] Unspecified error

当我使用Microsoft Word或Excel的正确hwnd运行同一个脚本时,它可以工作。你知道吗

获取应用程序的hwnd、遍历所有子级并尝试运行AOFW的示例代码。我遍历了所有可能的子级,因为我知道在Word或Excel上,根据this question,必须使用一个可访问的窗口,而不是整个父级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

我试过几个应用程序,唯一一个有孩子可以启动lazybind coobject的应用程序是microsoftoffice应用程序。其他的都印了很多“没有骰子”

无法获取已部署应用程序的COMObject吗?你知道吗

小时


Tags: offromimport应用程序applicationexcelwordwin32gui