Как получить top_level_parent () элемента в стартовом меню Windows? - PullRequest
1 голос
/ 31 марта 2020

В следующем коде top_level_parent () генерирует исключение, если курсор мыши находится над «элементом списка» в стартовом меню Windows (например, «Google Chrome» или «Notepad ++»)

x, y = win32api.GetCursorPos()
element_from_point = pywinauto.uia_defines.IUIA().iuia.ElementFromPoint(tagPOINT(x, y))
element_info = pywinauto.uia_element_info.UIAElementInfo(element_from_point)
wrapper = pywinauto.controls.uiawrapper.UIAWrapper(element_info)
wrapper_top_level_parent = wrapper.top_level_parent()

Screenshot of Inspecte.exe

Traceback (most recent call last):
  File "C:\Users\d_pra\PycharmProjects\pywinauto_recorder\pywinauto_recorder\recorder.py", line 270, in get_wrapper_path
    wrapper_top_level_parent = wrapper.top_level_parent()
  File "D:\Python\lib\site-packages\pywinauto\base_wrapper.py", line 439, in top_level_parent
    return self.parent().top_level_parent()
  File "D:\Python\lib\site-packages\pywinauto\base_wrapper.py", line 439, in top_level_parent
    return self.parent().top_level_parent()
  File "D:\Python\lib\site-packages\pywinauto\base_wrapper.py", line 433, in top_level_parent
    parent = self.parent()
  File "D:\Python\lib\site-packages\pywinauto\base_wrapper.py", line 409, in parent
    return self.backend.generic_wrapper_class(parent_elem)
  File "D:\Python\lib\site-packages\pywinauto\controls\uiawrapper.py", line 186, in __new__
    return super(UIAWrapper, cls)._create_wrapper(cls, element_info, UIAWrapper)
  File "D:\Python\lib\site-packages\pywinauto\base_wrapper.py", line 126, in _create_wrapper
    new_class = cls_spec.find_wrapper(element_info)
  File "D:\Python\lib\site-packages\pywinauto\controls\uiawrapper.py", line 159, in find_wrapper
    if element.control_type in UiaMeta.control_type_to_cls:
  File "D:\Python\lib\site-packages\pywinauto\uia_element_info.py", line 250, in control_type
    return self._get_control_type()
  File "D:\Python\lib\site-packages\pywinauto\uia_element_info.py", line 112, in _get_current_control_type
    return IUIA().known_control_type_ids[self._element.CurrentControlType]
KeyError: 50039

1 Ответ

1 голос
/ 11 апреля 2020

Исключение было вызвано тем, что "semanti c zoom" не был типом управления, известным моим модулем оболочки typelib для UIAutomationCore.dll, сгенерированным пакетом comtypes. Я исправил проблему, удалив Lib \ site-packages \ comtypes \ gen, и восстановил ее, запустив python -m "pywinauto".

. Я думаю, что эта проблема связана с ОС, которую я использовал, когда я впервые запустил Pywinauto, это было Windows 7, он сгенерировал Lib \ site-packages \ comtypes \ gen без SemanticZoom и AppBar. Теперь моя ОС Windows 10.

Согласно https://docs.microsoft.com/en-us/windows/win32/winauto/uiauto-controltype-ids

UIA_AppBarControlTypeId Идентифицирует тип элемента управления AppBar. Поддерживается начиная с Windows 8.1.

UIA_SemanticZoomControlTypeI Идентифицирует тип элемента управления SemanticZoom. Поддерживается начиная с Windows 8.

...