diff --git a/Index.xhtml b/Index.xhtml
index db0a26fa..0398f2a0 100644
--- a/Index.xhtml
+++ b/Index.xhtml
@@ -64,7 +64,7 @@
///Функция визуализации дерева
mGlobal.ElementTree.fRender = function(inElementsTreeDataArray)
{
- var lHTMLList='
';
+ var lHTMLList='
';
///Циклический обход списка
for (var i = 0; i< inElementsTreeDataArray.length;i++) {
///Добавить HTML код позиции
diff --git a/winGUI.py b/winGUI.py
index 6aad3aad..39c9e59f 100644
--- a/winGUI.py
+++ b/winGUI.py
@@ -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):
+ 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']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 (lResultElementX1lChildFoundedElementX2) 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 (lResultElementX1lChildFoundedElementX2) 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():