Что нового

Проблемы работы с элементами окна

vovsla

Осваивающий
Сообщения
607
Репутация
36
Есть программа с элементами которой не получается работать по ID элемента, но зато можно работать по ClassnameNN элемента.
Только есть одно но, под разными ОС ClassnameNN одних и тех же элементов всегда разный.
Что можно придумать в данном случае чтобы не прописывать ClassnameNN для каждой ОС?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
получить его
http://autoit-script.ru/index.php?topic=18688.0
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
В автоит вин инфо есть в разделе >>>> Control <<<< есть параметр Name. Как его получить?
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Если получать элементы дочернего окна в одном и том же окне одной и той же программы, то порядок элементов в массиве всегда будет одинаковый или он может быть произвольным в зависимости от каких-то обстоятельств?

Код:
$HWin=WinGetHandle('название окна')

$ChWin=_WinAPI_EnumChildWindows ( $HWin )
For $i =1  To  $ChWin[0][0]
	ConsoleWrite(ControlGetText($HWin, '', $ChWin[$i][0])& @CRLF  )
Next
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Vovsla
Порядок элементов определяется последовательностью их создания. Приложение может изменить порядок, удалив и заново создав элемент. Или применить функцию _WinAPI_BringWindowToTop($hCtrl), изменяющую порядок элементов (так называемый "tab order", по аналогии с оконным "z-order").

Если честно, не понимаю вашей проблемы. Если нужно найти элемент по WF-имени, то так и ищите
Код:
ControlGetHandle("Title", "", "[NAME:Edit1]")
Если у элемента есть текст, то можно и по тексту
Код:
ControlGetHandle("Title", "", "[TEXT:Открыть]") ; кнопка "Открыть"
ControlGetHandle("Title", "", "Открыть") ; та же самая кнопка "Открыть"
Даже к координатам и размерам можно привязаться (см. справку).
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Изначально я думал - соберу полный перечень сведений, по каким-нить параметрам наверняка можно будет определить элемент.
Для определения ClassnameNN собираю: Class, Instance, ID, Text, PositionX, PositionY, Width, Height, Style, ExStyle, Handle, IsVisible, IsEnabled
Хотя, Instance, ID, Handle лишние т.к. всегда разные.
Одна из проблем - элементы Edit. У них одинаковые Width, Height, Style, ExStyle, IsVisible, IsEnabled
Текст в этих элементах как правило отсутствует, или может быть произвольным на момент определения.
Когда решил определять по координатам - выяснилось что координаты элементов меняются т.к. окно может растягиваться как угодно, опция программы "Вернуть по умолчанию" которая делает окно изначальных размеров не гарантирует расположение элементов на точно таких же координатах. Пока писал пришла идея попробовать задать размер окна с помощью WinMove.

С получением ClassnameNN по Name толком не разбирался т.к. попадаются одинаковые Name, но недавно выяснил что одинаковые Name в разных дочерних окнах. Еще меня смущает что у некоторых элементов Name пустой. Хотя, вроде, пока с элементами у которых пустой Name работать не нужно, так что наверно буду пробовать с Name.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Vovsla
элементы Edit. У них одинаковые Width, Height
Если они не накладываются друг на друга, значит X и/или Y у них разные. Следовательно, можно определять по левее-правее и/или ниже-выше.

"Вернуть по умолчанию" <...> не гарантирует расположение элементов на точно таких же координатах
Зачем тогда эта опция? :stars: Хрень какая-то, а не программа.
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
InnI сказал(а):
Vovsla
элементы Edit. У них одинаковые Width, Height
Если они не накладываются друг на друга, значит X и/или Y у них разные. Следовательно, можно определять по левее-правее и/или ниже-выше.

"Вернуть по умолчанию" <...> не гарантирует расположение элементов на точно таких же координатах
Зачем тогда эта опция? :stars: Хрень какая-то, а не программа.

Да, можно определять по левее-правее, я тоже об этом задумался на минутку и на первый взгляд мне это показалось не очень простой задачей и я эту идею отложил на потом, пока плохо представляю схему работы алгоритма

А что хрень - это точно. Называется - сделали программу "для автоматизации работ". Только чтобы можно было нормально работать приходится писать программу для автоматизации работ в программе "для автоматизации работ".
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Vovsla
определять по левее-правее
Вариант: двумерный массив с координатой X и дескриптором. Собираем координаты, сортируем. Также и по Y
Код:
#include <Array.au3>

Global $aX[5][2], $aY[5][2]

$GUI = GUICreate("test")
For $i = 1 To 5
  GUICtrlCreateEdit("", Random(0, 200, 1), Random(0, 250, 1))
Next
GUISetState()

SortByCoord()

For $i = 0 To 4
  ControlFocus($GUI, "", $aX[$i][1])
  Sleep(1000)
  ControlSend($GUI, "", $aX[$i][1], $i & ":")
Next
For $i = 0 To 4
  ControlFocus($GUI, "", $aY[$i][1])
  Sleep(1000)
  ControlSend($GUI, "", $aY[$i][1], $i)
Next

Do
Until GUIGetMsg() = -3

Func SortByCoord()
  Local $aPos, $hCtrl
  For $i = 0 To 4
    $aPos = ControlGetPos($GUI, "", "Edit" & $i + 1)
    $hCtrl = ControlGetHandle($GUI, "", "Edit" & $i + 1)
    $aX[$i][0] = $aPos[0]
    $aX[$i][1] = $hCtrl
    $aY[$i][0] = $aPos[1]
    $aY[$i][1] = $hCtrl
  Next
  _ArraySort($aX)
  _ArraySort($aY)
EndFunc
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Хорошая идея. Только пришлось еще ширину и высоту добавить.

Код:
Func ElementsWriteDB($WinName)
	$WinHandle=WinGetHandle($WinName)

	$ElementsArr=_WinAPI_EnumChildWindows($WinHandle , False)
	$ParentWnd = _WinAPI_GetAncestor($WinHandle, 2)
	_SQLite_Exec(-1, "CREATE TABLE IF NOT EXISTS TMPTable (ClassnameNN VARCHAR, PosX NUMERIC, PosY NUMERIC, Width NUMERIC, Height NUMERIC );")
	_SQLite_Exec(-1, 'BEGIN;')
	For $EANum=1 To $ElementsArr[0][0]
		$Instance=GetInstance2($ElementsArr[$EANum][0], $ParentWnd)
		$Position = ControlGetPos($ParentWnd, "", $ElementsArr[$EANum][0])
		If Not IsArray($Position) Then Dim $Position[4]
		_SQLite_Exec(-1, "INSERT INTO TMPTable VALUES ('"&$ElementsArr[$EANum][1]&$Instance&"', '"&$Position[0]&"', '"&$Position[1]&"', '"&$Position[2]&"', '"&$Position[3]&"');")
	Next
	_SQLite_Exec(-1, 'COMMIT;')

	Dim $VarValArr, $VarValRows, $VarValColumns
	_SQLite_GetTable2d(-1, "SELECT * FROM TMPTable ORDER BY PosX, PosY, Width, Height  ;", $VarValArr, $VarValRows, $VarValColumns)

	_SQLite_Display2DResult($VarValArr)
;~ 	_ArrayDisplay($VarValArr)
EndFunc

Func GetInstance2($Control, $ParentWnd)
  Local $Class, $Wins, $Inst = 0
  $Class = _WinAPI_GetClassName($Control)
  If @error Then Return ""
  $Wins = _WinAPI_EnumChildWindows($ParentWnd, False)
  If IsArray($Wins) Then
    For $i = 1 To $Wins[0][0]
      If $Wins[$i][1] = $Class Then $Inst += 1
      If $Wins[$i][0] = $Control Then Return $Inst
    Next
  EndIf
  Return ""
EndFunc


Результат
Код:
ClassnameNN                               PosX  PosY  Width  Height 
 WindowsForms10.Window.8.app4675           0     0     1255   27     
 WindowsForms10.Window.8.app4669           0     0     1255   70     
 WindowsForms10.Window.8.app4668           0     0     1255   74     
 WindowsForms10.Window.8.app4670           0     27    1255   43     
 WindowsForms10.Window.8.app4671           0     27    1255   43     
 WindowsForms10.Window.8.app4672           0     27    1255   43     
 WindowsForms10.Window.8.app4678           0     70    1255   4      
 WindowsForms10.BUTTON.app461              0     74    20     20     
 WindowsForms10.Window.8.app463            0     74    20     483    
 WindowsForms10.Window.8.app461            0     74    599    483    
 WindowsForms10.BUTTON.app462              0     94    20     20     
 WindowsForms10.Window.8.app464            0     114   20     10     
 WindowsForms10.BUTTON.app463              0     124   20     20     
 WindowsForms10.BUTTON.app464              0     144   20     20     
 WindowsForms10.BUTTON.app465              0     164   20     20     
 WindowsForms10.Window.8.app465            0     184   20     10     
 WindowsForms10.BUTTON.app466              0     194   20     20     
 WindowsForms10.BUTTON.app467              0     214   20     20     
 WindowsForms10.BUTTON.app468              0     234   20     20     
 WindowsForms10.Window.8.app4615           0     557   599    4      
 WindowsForms10.Window.8.app466            0     557   599    323    
 WindowsForms10.Window.8.app4612           0     561   599    27     
 WindowsForms10.Window.8.app467            0     561   599    319    
 WindowsForms10.Window.8.app468            0     588   599    292    
 WindowsForms10.Window.8.app469            0     588   599    292    
 WindowsForms10.Window.8.app4610           0     588   599    292    
 WindowsForms10.msctls_statusbar32.app461  0     880   1255   22     
 WindowsForms10.STATIC.app4618             7     27    46     16     
 WindowsForms10.STATIC.app465              7     588   46     16     
 WindowsForms10.STATIC.app462              7     628   48     16     
 WindowsForms10.STATIC.app466              7     668   60     16     
 WindowsForms10.STATIC.app469              7     708   58     16     
 WindowsForms10.STATIC.app468              7     756   54     16     
 WindowsForms10.EDIT.app4619               8     43    64     20     
 WindowsForms10.EDIT.app468                8     604   104    20     
 WindowsForms10.EDIT.app465                8     644   104    20     
 WindowsForms10.COMBOBOX.app461            8     684   440    21     
 WindowsForms10.EDIT.app469                8     724   104    20     
 WindowsForms10.RichEdit20W.app461         8     772   440    76     
 WindowsForms10.EDIT.app461                20    74    0      0      
 WindowsForms10.EDIT.app462                20    74    0      0      
 WindowsForms10.Window.8.app462            20    74    579    483    
 WindowsForms10.SCROLLBAR.app461           20    540   579    17     
 WindowsForms10.EDIT.app463                37    126   59     14     
 WindowsForms10.STATIC.app4617             79    27    57     16     
 WindowsForms10.COMBOBOX.app463            80    43    96     21     
 WindowsForms10.STATIC.app464              119   588   81     16     
 WindowsForms10.STATIC.app461              119   628   84     16     
 WindowsForms10.STATIC.app467              119   708   69     16     
 WindowsForms10.Window.8.app4611           120   604   136    20     
 WindowsForms10.EDIT.app464                120   644   328    20     
 WindowsForms10.COMBOBOX.app462            120   724   136    21     
 WindowsForms10.EDIT.app467                125   607   101    13     
 WindowsForms10.STATIC.app4621             183   27    90     16     
 WindowsForms10.Window.8.app4674           184   43    96     20     
 WindowsForms10.EDIT.app4621               189   46    61     13     
 WindowsForms10.STATIC.app463              263   588   57     16     
 WindowsForms10.EDIT.app466                264   604   184    20     
 WindowsForms10.BUTTON.app469              264   726   112    18     
 WindowsForms10.STATIC.app4620             287   27    17     16     
 WindowsForms10.Window.8.app4673           288   43    96     20     
 WindowsForms10.EDIT.app4620               293   46    61     13     
 WindowsForms10.STATIC.app4619             391   27    60     16     
 WindowsForms10.COMBOBOX.app464            392   43    408    21     
 WindowsForms10.Window.8.app4614           568   568   14     13     
 WindowsForms10.Window.8.app4613           582   568   14     13     
 WindowsForms10.Window.8.app4667           599   74    4      806    
 WindowsForms10.Window.8.app4616           599   74    656    806    
 WindowsForms10.Window.8.app4664           603   74    652    27     
 WindowsForms10.Window.8.app4617           603   74    652    806    
 WindowsForms10.BUTTON.app4610             603   101   20     20     
 WindowsForms10.Window.8.app4623           603   101   20     296    
 WindowsForms10.Window.8.app4621           603   101   652    296    
 WindowsForms10.Window.8.app4618           603   101   652    779    
 WindowsForms10.Window.8.app4619           603   101   652    779    
 WindowsForms10.Window.8.app4620           603   101   652    785    
 WindowsForms10.BUTTON.app4611             603   121   20     20     
 WindowsForms10.Window.8.app4624           603   141   20     10     
 WindowsForms10.BUTTON.app4612             603   151   20     20     
 WindowsForms10.BUTTON.app4613             603   171   20     20     
 WindowsForms10.BUTTON.app4614             603   191   20     20     
 WindowsForms10.Window.8.app4625           603   211   20     10     
 WindowsForms10.BUTTON.app4615             603   221   20     20     
 WindowsForms10.Window.8.app4636           603   397   652    4      
 WindowsForms10.Window.8.app4626           603   397   652    170    
 WindowsForms10.Window.8.app4633           603   401   652    27     
 WindowsForms10.Window.8.app4627           603   401   652    166    
 WindowsForms10.Window.8.app4628           603   428   652    139    
 WindowsForms10.Window.8.app4629           603   428   652    139    
 WindowsForms10.Window.8.app4630           603   428   652    139    
 WindowsForms10.Window.8.app4663           603   567   652    4      
 WindowsForms10.Window.8.app4637           603   567   652    319    
 WindowsForms10.Window.8.app4660           603   571   652    27     
 WindowsForms10.Window.8.app4638           603   571   652    315    
 WindowsForms10.BUTTON.app4616             603   598   20     20     
 WindowsForms10.BUTTON.app4618             603   598   20     20     
 WindowsForms10.Window.8.app4644           603   598   20     264    
 WindowsForms10.Window.8.app4648           603   598   20     264    
 WindowsForms10.Window.8.app4646           603   598   413    264    
 WindowsForms10.Window.8.app4640           603   598   652    263    
 WindowsForms10.Window.8.app4641           603   598   652    264    
 WindowsForms10.Window.8.app4642           603   598   652    264    
 WindowsForms10.Window.8.app4645           603   598   652    264    
 WindowsForms10.Window.8.app4639           603   598   652    288    
 WindowsForms10.BUTTON.app4617             603   618   20     20     
 WindowsForms10.BUTTON.app4619             603   618   20     20     
 WindowsForms10.Window.8.app4649           603   638   20     10     
 WindowsForms10.BUTTON.app4620             603   648   20     20     
 WindowsForms10.BUTTON.app4621             603   668   20     20     
 WindowsForms10.BUTTON.app4622             603   688   20     20     
 WindowsForms10.STATIC.app4614             610   428   56     16     
 WindowsForms10.STATIC.app4612             610   468   39     16     
 WindowsForms10.Window.8.app4632           611   444   300    20     
 WindowsForms10.EDIT.app4614               611   484   80     20     
 WindowsForms10.EDIT.app4616               616   447   278    13     
 WindowsForms10.EDIT.app4610               623   101   0      0      
 WindowsForms10.EDIT.app4611               623   101   0      0      
 WindowsForms10.Window.8.app4622           623   101   632    296    
 WindowsForms10.SCROLLBAR.app462           623   380   632    17     
 WindowsForms10.Window.8.app4647           623   598   393    264    
 WindowsForms10.Window.8.app4643           623   598   632    264    
 WindowsForms10.SCROLLBAR.app464           623   845   393    17     
 WindowsForms10.SCROLLBAR.app463           623   845   632    17     
 WindowsForms10.STATIC.app4611             706   468   34     16     
 WindowsForms10.EDIT.app4613               707   484   80     20     
 WindowsForms10.STATIC.app4610             794   468   93     16     
 WindowsForms10.EDIT.app4612               795   484   416    20     
 WindowsForms10.STATIC.app4613             914   428   50     16     
 WindowsForms10.Window.8.app4631           915   444   300    20     
 WindowsForms10.EDIT.app4615               920   447   278    13     
 WindowsForms10.Window.8.app4659           1016  598   4      264    
 WindowsForms10.Window.8.app4650           1016  598   239    264    
 WindowsForms10.Window.8.app4656           1020  598   235    27     
 WindowsForms10.Window.8.app4651           1020  598   235    264    
 WindowsForms10.Window.8.app4652           1020  625   235    237    
 WindowsForms10.Window.8.app4653           1020  625   235    237    
 WindowsForms10.Window.8.app4654           1020  625   235    237    
 WindowsForms10.STATIC.app4616             1027  625   64     16     
 WindowsForms10.STATIC.app4615             1027  665   41     16     
 WindowsForms10.EDIT.app4618               1028  641   120    20     
 WindowsForms10.Window.8.app4655           1028  681   120    20     
 WindowsForms10.EDIT.app4617               1033  684   98     13     
 WindowsForms10.Window.8.app4677           1224  7     14     13     
 WindowsForms10.Window.8.app4666           1224  81    14     13     
 WindowsForms10.Window.8.app4635           1224  408   14     13     
 WindowsForms10.Window.8.app4662           1224  578   14     13     
 WindowsForms10.Window.8.app4658           1224  605   14     13     
 WindowsForms10.Window.8.app4676           1238  7     14     13     
 WindowsForms10.Window.8.app4665           1238  81    14     13     
 WindowsForms10.Window.8.app4634           1238  408   14     13     
 WindowsForms10.Window.8.app4661           1238  578   14     13     
 WindowsForms10.Window.8.app4657           1238  605   14     13

Может что-то и получится, хотя есть повторы. Нужно будет стиль добавить...
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Vovsla
А вы, случайно, не MDI-интерфейс автоматизируете? Если да, то ClassnameNN элемента будет меняться в зависимости от положения окна-родителя относительно других MDI-окон. Другими словами, если расположить MDI-окна в определённой последовательности, то и порядок элементов должен быть одинаковый.
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Да, он самый. С расположением окон не экспериментировал, т.к. никто расположение окон не меняет. В моем случае ClassnameNN меняется в зависимости от ОС. Причем даже если это одна ОС, например Win7, то влияет редакция Pro/Enterprise. Когда у нас появились разные ОС, то я назначал ClassnameNN в зависимости от ОС и у всех все работало. Но потом появились разные редакции и планируется переход на новую версию автоматизируемой программы, у нее другие ClassnameNN. В данном случае определять ClassnameNN ручками довольно хлопотно и долго.
 
Верх