Что нового

Элементы управления за пределами интерфейса

winstan

Эксплотатор)
Сообщения
406
Репутация
79
В общем столкнулся с такой проблемой.
Запускаю программу. Появляется окно но из-за проблем с разрешением монитора окно сжимается до размера монитора и часть элиментов управления получается скрытой, а они уж очень сильно нужны.
Кто что посоветует? Как например можно "просканировать" окно на элементы и используя ControlSend на них жать?
 

Arei

Скриптер
Сообщения
938
Репутация
115
думаю
Код:
WinMove
поможет,т.к может переместить окно и изменить его размер.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
winstan,
Посмотрите функцию _WinAPI_EnumChildWindows() в WinAPIEx.au3.
Пример для калькулятора:
Код:
#include <Array.au3>
#include <WinAPIEx.au3>

$sClass = 'Button'
$j = 0

Run('calc.exe')
$hWin = WinWait('[Class:SciCalc]', '', 3)
If Not $hWin Then Exit
$iStart = TimerInit()
$aData = _WinAPI_EnumChildWindows($hWin, 0)
If Not IsArray($aData) Then Exit
Dim $aResult[$aData[0][0] + 1][6]
For $i = 1 To $aData[0][0]
	If $aData[$i][1] == $sClass Then
		$j += 1
		$aResult[$j][0] = '[CLASS:' & $aData[$i][1] & '; INSTANCE:' & $j & ']'
		$aResult[$j][1] = $aData[$i][0]
		$aResult[$j][2] = _WinAPI_GetDlgCtrlID($aData[$i][0])
		$aTemp = ControlGetPos($hWin, '', $aData[$i][0])
		If Not @error Then
			For $q = 0 To 1
				$aResult[$j][$q + 3] = $aTemp[$q]
			Next
		EndIf
		$aResult[$j][5] = ControlGetText($hWin, '', $aResult[$j][1])
	EndIf
Next
ReDim $aResult[$j + 1][6]
$aResult[0][0] = 'Class name'
$aResult[0][1] = 'Handle'
$aResult[0][2] = 'ID'
$aResult[0][3] = 'X'
$aResult[0][4] = 'Y'
$aResult[0][5] = 'Text'
$sTime = StringFormat('%.2f ms', TimerDiff($iStart))
_ArrayDisplay($aResult, $sTime)
На 7 Class:SciCalc вроде другой.
 
Автор
winstan

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Arei
Я забыл уточнить что могу изменить и так размер окна, но размер самоограничевается и разширение выше установленых границ блокируется.
madmasles
Пример помог, осталось "придумать" эту невидимую часть интерфейся чтобы разобраться с управлением)

P.S. в Windows 7 калькулятор имеит класс CalcFrame

P.S.S. Куда делась кнопка "Тема решена"?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
winstan [?]
осталось "придумать" эту невидимую часть интерфейся чтобы разобраться с управлением
test.au3:
Код:
#include <GUIConstantsEx.au3>

Dim $aButton[11] = [10]
GUICreate('Test', 200, 200)
For $i = 1 To $aButton[0]
	$aButton[$i] = GUICtrlCreateButton('Button ' & $i, 220, 10 + ($i - 1) * 35, 70, 25)
Next
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $aButton[1] To $aButton[$aButton[0]]
			For $i = 1 To $aButton[0]
				If $nMsg = $aButton[$i] Then
					ToolTip('Button ' & $i, 0, 0)
				EndIf
			Next
	EndSwitch
WEnd
Кладем test.au3 рядом с:
Код:
#include <Array.au3>
#include <WinAPIEx.au3>

$sClass = 'Button'
$iCount = 0

$sFileAU3 = @ScriptDir & '\test.au3'
Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sFileAU3 & '"')
$hWin = WinWait('[Title:Test; Class:AutoIt v3 GUI]', '', 5)
If Not $hWin Then Exit
WinMove($hWin, '', 30, 30)
$iStart = TimerInit()
$aData = _WinAPI_EnumChildWindows($hWin, 0)
If Not IsArray($aData) Then Exit
Dim $aResult[$aData[0][0] + 1][4]
For $i = 1 To $aData[0][0]
	If $aData[$i][1] == $sClass Then
		$iCount += 1
		$aResult[$iCount][0] = '[CLASS:' & $aData[$i][1] & '; INSTANCE:' & $iCount & ']'
		$aResult[$iCount][1] = $aData[$i][0]
		$aResult[$iCount][2] = _WinAPI_GetDlgCtrlID($aData[$i][0])
		$aResult[$iCount][3] = ControlGetText($hWin, '', $aResult[$iCount][1])
	EndIf
Next
ReDim $aResult[$iCount + 1][4]
$aResult[0][0] = 'Class name'
$aResult[0][1] = 'Handle'
$aResult[0][2] = 'ID'
$aResult[0][3] = 'Text'
$sTime = StringFormat('%.2f ms', TimerDiff($iStart))
_ArrayDisplay($aResult, $sTime)
; кликаем по 'Class name', 'Handle', 'ID', 'Text'
For $j = 0 To 3
	ConsoleWrite('кликаем по' & @TAB & $aResult[0][$j] & @LF)
	For $i = 1 To $iCount
		ConsoleWrite(ControlClick($hWin, '', $aResult[$i][$j]) & @TAB & $aResult[$i][$j] & @LF)
		Sleep(500)
	Next
	ConsoleWrite('-----' & @LF)
Next
И запускаем его. :smile:
 
Автор
winstan

winstan

Эксплотатор)
Сообщения
406
Репутация
79
madmasles
Канешно спасибо, но "придумывать" интерфейс я буду при помощи разума и моего воображения.
 
Верх