Advertisement
AZJIO

грабить окно.au3

Apr 29th, 2018
838
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 6.95 KB | None | 0 0
  1. ; @AZJIO
  2. ; Тестовый скрипт. Указываем заголовок окна (или класс), пример в строке 9-13 и запускаем скрипт, после закрытия окна с массивом элементов в той же папке со скриптом появится файл скрипт с таким же интерфейсом. Недостаток - пока не прописаны индивидуально каждый элемент и не протестировано на многих окнах, соответсвенно результат нужно доводить. Так же некоторые элементы как "кнопка" (Button) имеет несколько видов определяемых стилями, это тоже не детектируется.
  3.  
  4. #include <WinAPI.au3>
  5. #include <Array.au3>
  6. #include <Constants.au3>
  7. #include <GuiButton.au3>
  8.  
  9. ; Ожидание 5 секунд до появление окна блокнота
  10. ; $hWnd = WinWait("[CLASS:Notepad++]", "", 5)
  11. ; $hWnd = WinWait("[CLASS:AutoIt v3 GUI]", "", 5)
  12. ; $hWnd = WinWait("[CLASS:CabinetWClass]", "", 5)
  13. $hWnd = WinWait("[TITLE:7z SFX Constructor v4.4 Portable]", "", 5)
  14. If $hWnd Then
  15.     _ViewArray($hWnd)
  16. Else
  17.     MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
  18.     Exit
  19. EndIf
  20.  
  21. Func _ViewArray($hWnd)
  22.     Local $aWindows, $s
  23.     $sWind = WinGetTitle($hWnd)
  24.     $aPosWind = WinGetPos($hWnd)
  25.     If @error Then
  26.         $sPosWind =  '-1, -1, -1, -1'
  27.     Else
  28.         $sPosWind =  $aPosWind[2] & ', ' & $aPosWind[3] & ', ' & $aPosWind[0] & ', ' & $aPosWind[1]
  29.     EndIf
  30.     $script = ''
  31.     $aWindows = _WinAPI_EnumWindows(True, $hWnd)
  32.     Local $aWindows2D[$aWindows[0][0] + 1][5] = [[$aWindows[0][0]]]
  33.     For $i = 1 To $aWindows[0][0]
  34.         $aWindows2D[$i][0] = $aWindows[$i][0]
  35.         $aWindows2D[$i][1] = $aWindows[$i][1]
  36.         $aWindows2D[$i][2] = StringReplace(StringStripCR(WinGetTitle($aWindows[$i][0])), @LF, ' \n ')
  37.         If Not $aWindows2D[$i][2] Then $aWindows2D[$i][2] = StringReplace(StringStripCR(WinGetText($aWindows[$i][0])), @LF, ' \n ')
  38.         ; $aStyleWnd = GUIGetStyle($aWindows[$i][0])
  39.         ; If  @error Or Not IsArray($aStyleWnd) Then
  40.             $aWindows2D[$i][3] = _WinAPI_GetWindowLong($aWindows[$i][0], $GWL_STYLE) & ', ' & _WinAPI_GetWindowLong($aWindows[$i][0], $GWL_EXSTYLE)
  41.         ; Else
  42.             ; $aWindows2D[$i][3] = $aStyleWnd[0] & ', ' & $aStyleWnd[1]
  43.         ; EndIf
  44.         $aPos = ControlGetPos($hWnd, '', $aWindows[$i][0])
  45.         If  @error Then
  46.             $aWindows2D[$i][4] = '-1, -1, -1, -1'
  47.         Else
  48.             $aWindows2D[$i][4] =  $aPos[0] & ', ' & $aPos[1] & ', ' & $aPos[2] & ', ' & $aPos[3]
  49.         EndIf
  50.         $script &= _GetNameFunc($aWindows2D, $i)
  51.     Next
  52.     ; $s = Chr(1)
  53.     $s = '|'
  54.     _ArrayDisplay($aWindows2D, $sWind, -1, 0, $s, $s, '№' & $s & 'Дескриптор' & $s & 'Класс' & $s & 'Заголовок' & $s & 'Стиль' & $s & 'Координаты')
  55.     If $script Then
  56.         If StringInStr($script, '_GUICtrlComboBoxEx_Create') Then $script = '#include <GuiComboBoxEx.au3>' & @CRLF & $script
  57.         If StringInStr($script, '_GUICtrlIpAddress_Create') Then $script = '#include <GuiIPAddress.au3>' & @CRLF & $script
  58.         If StringInStr($script, '_GUICtrlRebar_Create') Then $script = '#include <GuiReBar.au3>' & @CRLF & $script
  59.         If StringInStr($script, '_GUICtrlStatusBar_Create') Then $script = '#include <GuiStatusBar.au3>' & @CRLF & $script
  60.         If StringInStr($script, '_GUICtrlToolbar_Create') Then $script = '#include <GuiToolBar.au3>' & @CRLF & $script
  61.         If StringInStr($script, '_GUICtrlRichEdit_Create') Then $script = '#include <GuiRichEdit.au3>' & @CRLF & $script
  62.         $script = "$hGUI = GUICreate('" & $sWind & "', " & $sPosWind & ")" & @CRLF & $script
  63.         $script &= 'GUISetState()' & @CRLF & _
  64.                             'Do' & @CRLF & _
  65.                             'Until GUIGetMsg() = -3'
  66.         $hFile = FileOpen(@ScriptDir & '\file.au3', 2)
  67.         FileWrite($hFile, $script)
  68.         FileClose($hFile)
  69.     EndIf
  70. EndFunc   ;==>_ViewArray
  71.  
  72. Func _GetNameFunc(ByRef $aWin2D, $idx)
  73.     Local $aClass[20] = ['Button', 'Static', 'Edit', 'SysListView32', 'SysTabControl32', 'ListBox', 'ComboBox', 'msctls_trackbar32', 'SysTreeView32', 'SysAnimate32', 'SysDateTimePick32', 'msctls_updown32', 'SysMonthCal32', 'msctls_progress32', 'ComboBoxEx32', 'SysIPAddress32', 'ReBarWindow32', 'msctls_statusbar32', 'ToolbarWindow32', 'RICHEDIT50W']
  74.     Local $aCtpl[20] = ['GUICtrlCreateButton', 'GUICtrlCreateLabel', 'GUICtrlCreateInput', 'GUICtrlCreateListView', 'GUICtrlCreateTab', 'GUICtrlCreateList', 'GUICtrlCreateCombo', 'GUICtrlCreateSlider', 'GUICtrlCreateTreeView','GUICtrlCreateAvi','GUICtrlCreateDate','GUICtrlCreateUpdown','GUICtrlCreateMonthCal','GUICtrlCreateProgress','_GUICtrlComboBoxEx_Create','_GUICtrlIpAddress_Create','_GUICtrlRebar_Create','_GUICtrlStatusBar_Create','_GUICtrlToolbar_Create', '_GUICtrlRichEdit_Create']
  75.     ; класс Static может быть GUICtrlCreateGraphic, GUICtrlCreatePic
  76.     ; класс Button может быть чекбоксом, радиокнопкой, группой, взависимости от стиля
  77.     ; Если высота Edit более 40 то GUICtrlCreateEdit
  78.     ; меню и контекстное меню не видит, а также подсказки
  79.     $ind = 999
  80.     For $i = 0 To 19
  81.         If $aWin2D[$idx][1] = $aClass[$i] Then
  82.             $ind = $i
  83.         EndIf
  84.     Next
  85.     If $ind = 999 Then $ind = 1
  86.     $sCtpl = $aCtpl[$ind]
  87.     $sText = "'" & $aWin2D[$idx][2] & "', "
  88.     $aStyle = StringSplit($aWin2D[$idx][3], ', ')
  89.     $sStyle1 = $aStyle[0]
  90.     $sStyle2 = $aStyle[1]
  91.     Switch $ind
  92.         Case 0
  93.             ; If BitAND($aStyle[0], $BS_GROUPBOX) Then $sCtpl = 'GUICtrlCreateGroup'
  94.             ; If BitAND($aStyle[0], $BS_CHECKBOX) Then $sCtpl = 'GUICtrlCreateCheckbox'
  95.             ; If BitAND($aStyle[0], $BS_AUTO3STATE) Or BitAND($aStyle[0], $BS_AUTOCHECKBOX) Then $sCtpl = 'GUICtrlCreateCheckbox'
  96.             ; If BitAND($aStyle[0], $BS_AUTORADIOBUTTON) Then $sCtpl = 'GUICtrlCreateRadio'
  97.         Case 7, 8, 13, 15
  98.             $sText = ''
  99.         Case 9
  100.             $sText &= '0, '
  101.         Case 2
  102.             $aHeight = StringSplit($aWin2D[$idx][4], ', ')
  103.             If $aHeight[4] > 40 Then $sCtpl = 'GUICtrlCreateEdit'
  104.         Case 16
  105.             Return $sCtpl & '($hGUI, ' & $sStyle1 & ')' & @CRLF
  106.         Case 17
  107.             Return $sCtpl & '($hGUI, -1, ' & $sText & $aWin2D[$idx][3] & ')' & @CRLF
  108.     EndSwitch
  109.     ; $aStyle = $aWin2D[$idx][3]
  110.     ; If IsArray($aStyle) Then
  111.         ; $sStyle1 = $aStyle[0]
  112.         ; $sStyle2 = $aStyle[1]
  113.     ; Else
  114.         ; $sStyle1 = -1
  115.         ; $sStyle2 = -1
  116.     ; EndIf
  117.     If $ind > 13 Then
  118.         Return $sCtpl & "($hGUI, " & $sText & $aWin2D[$idx][4] & ', ' & $aWin2D[$idx][3] & ')' & @CRLF
  119.     Else
  120.         Return $sCtpl & "(" & $sText & $aWin2D[$idx][4] & ', ' & $aWin2D[$idx][3] & ')' & @CRLF
  121.     EndIf
  122.     ; If $ind > 13 Then
  123.         ; Return $aCtpl[$ind] & "($hGUI, '" & $aWin2D[$idx][2] & "', " & $aWin2D[$idx][4] & ', ' & $sStyle1 & ', ' & $sStyle2 & ')' & @CRLF
  124.     ; Else
  125.         ; Return $aCtpl[$ind] & "('" & $aWin2D[$idx][2] & "', " & $aWin2D[$idx][4] & ', ' & $sStyle1 & ', ' & $sStyle2 & ')' & @CRLF
  126.     ; EndIf
  127. EndFunc
  128. ; GUICtrlCreateObj
  129. ; Internet Explorer_Server
  130. ; Shell DocObject View
  131. ; Shell Embedding
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement