@ -16,8 +16,8 @@ from threading import Timer
mFlagIsDebug = False
mPywinautoApplication = pywinauto . Application ( backend = " win32 " )
mPywinautoActiveBackend = " win32 "
#mPywinautoActiveBackend="uia "
#mPywinautoActiveBackend="win32 "
mPywinautoActiveBackend = " uia "
#mPywinautoApplication=pywinauto.Application(backend="uia")
#####
@ -50,7 +50,7 @@ def AutomationSearchMouseElement(inElementSpecification,inFlagIsSearchOnline=Tru
lElementFounded = { }
#Создать карту пикселей и элементов
#####Внимание! Функция GUISearchElementByRootXY не написана
lElementFounded = GUISearchElementByRootXY ( GetControl ( inElementSpecification ) , lX , lY )
lElementFounded = GUISearchElementByRootXY ( PywinautoExtElementGet ( inElementSpecification ) , lX , lY )
#Подсветить объект, если он мышь раньше стояла на другом объекте
if lGUISearchElementSelected != lElementFounded :
lGUISearchElementSelected = lElementFounded
@ -66,7 +66,7 @@ def AutomationSearchMouseElement(inElementSpecification,inFlagIsSearchOnline=Tru
else :
lBitmap = { }
#Создать карту пикселей и элементов
lBitmap = GUISearchBitmapCreate ( GetControl ( inElementSpecification ) , lBitmap )
lBitmap = GUISearchBitmapCreate ( PywinautoExtElementGet ( inElementSpecification ) , lBitmap )
#Выдать сообщение, что поиск готов к использованию
#print("GUISearch: Ready for search!")
###########
@ -145,19 +145,56 @@ def PywinautoExtElementCtrlIndexGet(inElement):
lElementParentChildrenList = lElementParent . children ( )
#Циклический поиск до того момента, пока не упремся в текущий элемент
while lFlagFind :
#Прекратить поиск, если элемент был обнаружен
if inElement == lElementParentChildrenList [ lResult ] :
lFlagFind = False
else :
#Прекратить поиски, если итератор вышел за пределы списка
if lResult > = len ( lElementParentChildrenList ) :
lResult = None
if lResult < len ( lElementParentChildrenList ) :
#Прекратить поиск, если элемент был обнаружен
if inElement == lElementParentChildrenList [ lResult ] :
lFlagFind = False
else :
lResult = lResult + 1
#Прекратить поиски, если итератор вышел за пределы списка
if lResult > = len ( lElementParentChildrenList ) :
lResult = None
lFlagFind = False
else :
lResult = lResult + 1
else :
lResult = - 1
lFlagFind = False
#Вернуть результат
return lResult
#Получить элемент через расширенный движок поиска
#[ {
#"index":<Позиция элемента в родительском объекте>,
#
#} ]
def PywinautoExtElementGet ( inSpecificationList , inElement = None ) :
lResult = None
lChildElement = None
#Получить родительский объект если на вход ничего не поступило
if inElement is None :
#сформировать спецификацию на получение элемента
lRootElementSpecification = [ inSpecificationList [ 0 ] ]
lChildElement = GetControl ( lRootElementSpecification )
#Елемент на вход поступил - выполнить е г о анализ
else :
#Поступил index
if ' index ' in inSpecificationList [ 0 ] :
lChildrenList = inElement . children ( )
if inSpecificationList [ 0 ] [ ' index ' ] < len ( lChildrenList ) :
#Получить дочерний элемент
lChildElement = lChildrenList [ inSpecificationList [ 0 ] [ ' index ' ] ]
#Поступил ctrl_index
elif ' ctrl_index ' in inSpecificationList [ 0 ] :
lChildrenList = inElement . children ( )
if inSpecificationList [ 0 ] [ ' ctrl_index ' ] < len ( lChildrenList ) :
#Получить дочерний элемент
lChildElement = lChildrenList [ inSpecificationList [ 0 ] [ ' ctrl_index ' ] ]
#Выполнить рекурсивный вызов, если спецификация больше одного элемента
if len ( inSpecificationList ) > 1 and lChildElement is not None :
#Вызвать рекурсивно функцию получения следующего объекта, если в спецификации есть следующий объект
lResult = PywinautoExtElementGet ( inSpecificationList [ 1 : ] , lChildElement )
else :
lResult = lChildElement
return lResult
################################
#Функция повторяющегося таймера
#############################
@ -272,9 +309,9 @@ def GetControl(inControlSpecificationArray):
#Получить массив свойств и методов у элемента
def ElementActionGetList ( inControlSpecificationArray ) :
#Получить объект
lObject = GetControl ( inControlSpecificationArray )
lActionList = dir ( lObject . wrapper_object ( ) )
lResult = dir ( lObject . wrapper_object ( ) )
lObject = PywinautoExtElementGet ( inControlSpecificationArray )
lActionList = dir ( lObject )
lResult = dir ( lObject )
#Выполнить чистку списка от неактуальных методов
for lActionItem in lActionList :
#Удалить те, которые начинаются на _
@ -287,9 +324,9 @@ def ElementActionGetList (inControlSpecificationArray):
#Выполнить действие над элементом
def ElementRunAction ( inControlSpecificationArray , inActionName , inArgumentList = [ ] , inkwArgumentObject = { } ) :
#Определить объект
lObject = GetControl ( inControlSpecificationArray )
lObject = PywinautoExtElementGet ( inControlSpecificationArray )
#Получить метод для вызова
lFunction = getattr ( lObject . wrapper_object ( ) , inActionName )
lFunction = getattr ( lObject , inActionName )
#Выполнить действие
return lFunction ( * inArgumentList , * * inkwArgumentObject )
@ -300,9 +337,9 @@ def ElementGetInfo(inControlSpecificationArray):
lResultList = [ ] ;
if len ( inControlSpecificationArray ) > 0 :
#Получить объект
lTempObject = GetControl ( inControlSpecificationArray )
lTempObject = PywinautoExtElementGet ( inControlSpecificationArray )
#Получить инфо объект
lTempObjectInfo = lTempObject . wrapper_object( ) . element_info
lTempObjectInfo = lTempObject . element_info
#Добавить информацию о б обнаруженом объекте
lResultList . append ( ElementInfoExportObject ( lTempObjectInfo ) ) ;
return lResultList
@ -415,49 +452,49 @@ def GUISearchElementByRootXY(inRootElement,inX,inY):
lResultElementX2 = lRootElementRectX2
lResultElementY1 = lRootElementRectY1
lResultElementY2 = lRootElementRectY2
#Получить список детей и добавить в карту
for lChildElement in inRootElement . children ( ) :
lChildFoundedElement = GUISearchElementByRootXY ( lChildElement , inX , inY )
#Установить обнаруженный элемент, если текущий результат пустой
if lResultElement is None and lChildFoundedElement is not None :
lResultElement = lChildFoundedElement
lResultElementX1 = lResultElement . element_info . rectangle . left
lResultElementX2 = lResultElement . element_info . rectangle . right
lResultElementY1 = lResultElement . element_info . rectangle . top
lResultElementY2 = lResultElement . element_info . rectangle . bottom
#Выполнить сверку lChildFoundedElement и lResultElement если о б а имеются
elif lResultElement is not None and lChildFoundedElement is not None :
#Правила перезатирания карты, если имеется старый объект
#[Накладываемый объект] - Н О - ElementNew
#[Имеющийся объект] - ИО - ElementOld
#3 типа вхождения объектов
#тип 1 - [имеющийся объект] полностью входит в [накладываемый объект] (ИО X1 Y1 >= Н О X1 Y1; ИО X2 Y2 <= Н О X2 Y2) - не вносить Н О в bitmap в эти диапазоны
#тип 2 - [имеющийся объект] полностью выходит за пределы [накладываемого объекта] (ИО X1 Y1 < Н О X1 Y1; ИО X2 Y2 > Н О X2 Y2) - вносить Н О в bitmap
#тип 3 - [имеющийся объект] частично входит в [накладываемый объект] (все остальные случаи)- вносить Н О в bitmap
#Получить координаты ИО
lChildFoundedElementInfo = lChildFoundedElement . element_info
#lElementNew = inElement
lChildFoundedElementX1 = lChildFoundedElementInfo . rectangle . left
lChildFoundedElementX2 = lChildFoundedElementInfo . rectangle . right
lChildFoundedElementY1 = lChildFoundedElementInfo . rectangle . top
lChildFoundedElementY2 = lChildFoundedElementInfo . rectangle . bottom
#Проверка вхождения по типу 1
if ( lResultElementX1 > = lChildFoundedElementX1 ) and ( lResultElementY1 > = lChildFoundedElementY1 ) and ( lResultElementX2 < = lChildFoundedElementX2 ) and ( lResultElementY2 < = lChildFoundedElementY2 ) :
False == True
#Проверка вхождения по типу 3
elif ( lResultElementX1 < lChildFoundedElementX1 ) and ( lResultElementY1 < lChildFoundedElementY1 ) and ( lResultElementX2 > lChildFoundedElementX2 ) and ( lResultElementY2 > lChildFoundedElementY2 ) :
#Получить список детей и добавить в карту
for lChildElement in inRootElement . children ( ) :
lChildFoundedElement = GUISearchElementByRootXY ( lChildElement , inX , inY )
#Установить обнаруженный элемент, если текущий результат пустой
if lResultElement is None and lChildFoundedElement is not None :
lResultElement = lChildFoundedElement
lResultElementX1 = lChildFoundedElementX1
lResultElementX2 = lChildFoundedElementX2
lResultElementY1 = lChildFoundedElementY1
lResultElementY2 = lChildFoundedElementY2
#Проверка вхождения по типу 2
else :
lResultElement = lChildFoundedElement
lResultElementX1 = lChildFoundedElementX1
lResultElementX2 = lChildFoundedElementX2
lResultElementY1 = lChildFoundedElementY1
lResultElementY2 = lChildFoundedElementY2
lResultElementX1 = lResultElement . element_info . rectangle . left
lResultElementX2 = lResultElement . element_info . rectangle . right
lResultElementY1 = lResultElement . element_info . rectangle . top
lResultElementY2 = lResultElement . element_info . rectangle . bottom
#Выполнить сверку lChildFoundedElement и lResultElement если о б а имеются
elif lResultElement is not None and lChildFoundedElement is not None :
#Правила перезатирания карты, если имеется старый объект
#[Накладываемый объект] - Н О - ElementNew
#[Имеющийся объект] - ИО - ElementOld
#3 типа вхождения объектов
#тип 1 - [имеющийся объект] полностью входит в [накладываемый объект] (ИО X1 Y1 >= Н О X1 Y1; ИО X2 Y2 <= Н О X2 Y2) - не вносить Н О в bitmap в эти диапазоны
#тип 2 - [имеющийся объект] полностью выходит за пределы [накладываемого объекта] (ИО X1 Y1 < Н О X1 Y1; ИО X2 Y2 > Н О X2 Y2) - вносить Н О в bitmap
#тип 3 - [имеющийся объект] частично входит в [накладываемый объект] (все остальные случаи)- вносить Н О в bitmap
#Получить координаты ИО
lChildFoundedElementInfo = lChildFoundedElement . element_info
#lElementNew = inElement
lChildFoundedElementX1 = lChildFoundedElementInfo . rectangle . left
lChildFoundedElementX2 = lChildFoundedElementInfo . rectangle . right
lChildFoundedElementY1 = lChildFoundedElementInfo . rectangle . top
lChildFoundedElementY2 = lChildFoundedElementInfo . rectangle . bottom
#Проверка вхождения по типу 1
if ( lResultElementX1 > = lChildFoundedElementX1 ) and ( lResultElementY1 > = lChildFoundedElementY1 ) and ( lResultElementX2 < = lChildFoundedElementX2 ) and ( lResultElementY2 < = lChildFoundedElementY2 ) :
False == True
#Проверка вхождения по типу 3
elif ( lResultElementX1 < lChildFoundedElementX1 ) and ( lResultElementY1 < lChildFoundedElementY1 ) and ( lResultElementX2 > lChildFoundedElementX2 ) and ( lResultElementY2 > lChildFoundedElementY2 ) :
lResultElement = lChildFoundedElement
lResultElementX1 = lChildFoundedElementX1
lResultElementX2 = lChildFoundedElementX2
lResultElementY1 = lChildFoundedElementY1
lResultElementY2 = lChildFoundedElementY2
#Проверка вхождения по типу 2
else :
lResultElement = lChildFoundedElement
lResultElementX1 = lChildFoundedElementX1
lResultElementX2 = lChildFoundedElementX2
lResultElementY1 = lChildFoundedElementY1
lResultElementY2 = lChildFoundedElementY2
except Exception as e :
False == False
return lResultElement
@ -554,9 +591,9 @@ def ElementGetChildElementList(inControlSpecificationArray=[]):
#ctypes.windll.user32.MessageBoxW(0, str(inControlSpecificationArray), "Your title", 1)
if len ( inControlSpecificationArray ) > 0 :
#Получить объект
lTempObject = GetControl ( inControlSpecificationArray )
lTempObject = PywinautoExtElementGet ( inControlSpecificationArray )
#Получить список дочерних объектов
lTempChildList = lTempObject . wrapper_object( ) . children( )
lTempChildList = lTempObject . children( )
lIterator = 0
#Подготовить результирующий объект
for lChild in lTempChildList :
@ -823,10 +860,10 @@ def GetRootElementList():
lResultList2 . append ( ElementInfoExportObject ( lI ) ) ;
return lResultList2
def ElementDrawOutlineNew ( inSpecificationArray ) :
draw_outline_new ( GetControl ( inSpecificationArray ) )
draw_outline_new ( PywinautoExtElementGet ( inSpecificationArray ) )
return
def ElementDrawOutlineNewFocus ( inSpecificationArray ) :
draw_outline_new_focus ( GetControl ( inSpecificationArray ) )
draw_outline_new_focus ( PywinautoExtElementGet ( inSpecificationArray ) )
return
def draw_outline_new ( lWrapperObject , colour = ' green ' , thickness = 2 , fill = win32defines . BS_NULL , rect = None , inFlagSetFocus = False ) :
if lWrapperObject is not None :
@ -842,7 +879,7 @@ def draw_outline_new(lWrapperObject,colour='green',thickness=2,fill=win32defines
if inFlagSetFocus :
#Установить фокус на объект, чтобы было видно выделение
lWrapperObject . set_focus ( )
time . sleep ( 0.5 )
#pdb.set_trace()
# don't draw if dialog is not visible
#if not lWrapperObject.is_visible():