Что нового

запустить приложение и нажать кнопку в открывшемся окне.

chatnsk

Новичок
Сообщения
11
Репутация
0
Версия AutoIt: 3.3.6.1

Описание: Есть приложение, запускаемое файлом launcher.exe после запуска появляется окно с заголовком "Launcher" в теле картинка и на ней одна кнопка "START". Очень хочется скрипт, запускающий данное приложение и нажимающий кнопку. После этого (если есть возможность) спрятать приложение launcher.exe (можно в трей)

Примечания: Моё первое знакомство с AutoIt. Ничего подобного найти не удалось.
Всем заранее спасибо!
:IL_AutoIt_1:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
chatnsk
Посмотрите с помощью Control Viewer или AutoIt v3 Window Info точный заголовок Вашего окна и реквизиты кнопки (например, [CLASS:Button; INSTANCE:1]), а потом попробуйте так:
Код:
$sTitle = 'Launcher' ;заголовок окна
$sFileExe = @ScriptDir & '\launcher.exe' ;полный путь к exe-файлу

Run($sFileExe, @ScriptDir, @SW_MINIMIZE);запускаем приложение в свернутом режиме
$hWin = WinWait($sTitle, '', 5);ждем 5 сек. окно
If Not $hWin Then
	MsgBox(16, 'Error', 'Нет окна');если окна нет - сообщение об ошибке и выход
	Exit
EndIf
ControlClick($hWin, '', '[CLASS:Button; INSTANCE:1]');клик по кнопке
;что Вам нужно дальше делать я не знаю.
 
Автор
C

chatnsk

Новичок
Сообщения
11
Репутация
0

вот скрин Window Info
только почему то там про кнопку ничего нет О_о

Код попробовал, окно открывает, но не свёрнутым, а как обычно и дальше ничего не происходит...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
chatnsk
Перетащите Finder Tool на Вашу кнопку.
А так?
Код:
$sTitle = 'SouIJI Launcher' ;заголовок окна
$sFileExe = @ScriptDir & '\launcher.exe' ;полный путь к exe-файлу

Run($sFileExe);запускаем приложение
$hWin = WinWait($sTitle, '', 5);ждем 5 сек. окно
If Not $hWin Then
    MsgBox(16, 'Error', 'Нет окна');если окна нет - сообщение об ошибке и выход
    Exit
EndIf
ControlClick($hWin, '', '[CLASS:Button; INSTANCE:1]');клик по кнопке
WinSetState($hWin, '', @SW_MINIMIZE)
;что Вам нужно дальше делать я не знаю.
 
Автор
C

chatnsk

Новичок
Сообщения
11
Репутация
0
Именно на кнопку я его и наводил в прошлый раз...
Вторая версия кода процесс не запустила и соответственно сказала, что "нет окна" :(
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Думаю вам нужно поискать примеры у ботоводов.
Дело в том, что в играх кнопки рисуются, это просто картинки, а события для мышки определяют координатами кнопки (картинки)

Вот пример на Autoit:
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <Misc.au3>

Opt('MouseCoordMode', 0)
AdlibRegister('_MouseListener', 30)

$hForm1 = GUICreate('Test button', 321, 241, -1, -1)
$hPic1 = GUICtrlCreatePic(@ScriptDir & '\bg.jpg', 0, 0, 320, 240, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
	Case $GUI_EVENT_CLOSE
		AdlibUnRegister('_MouseListener')
		Exit

	EndSwitch
WEnd

Func _MouseListener()
	If WinActive('Test button', '') Then
		$aPos = MouseGetPos()
		If _IsPressed('01') And ($aPos[0] > 90 And $aPos[0] < 230)  And ($aPos[1] > 120 And $aPos[1] < 160) Then
			MsgBox(0, 'Oops! :)', 'You clicked button!', 3)
		EndIf
	EndIf
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
chatnsk
С вашим рисунком я сделал окно:
Код:
#Include <GUIConstantsEx.au3>
#Include <Icons.au3>

GUICreate('SouIJI Launcher', 400, 313)
$Pic = GUICtrlCreatePic('', 0, 0, 400, 313)
_SetImage($Pic, @ScriptDir & '\launcher.png')
 GUISetState()
 While 1
	 $nMsg = GUIGetMsg()
	 Switch $nMsg
		 Case $GUI_EVENT_CLOSE
			 Exit

	 EndSwitch
 WEnd

С ним у меня этот код работает:
Код:
Opt('MouseCoordMode', 2)
Opt('PixelCoordMode', 2)

$sTitle = 'SouIJI Launcher' ;заголовок окна
$sFileExe = @ScriptDir & '\launcher.exe' ;полный путь к exe-файлу

Run($sFileExe, @ScriptDir);запускаем приложение
$hWin = WinWait($sTitle, '', 5);ждем 5 сек. окно
If Not $hWin Then
	MsgBox(16, 'Error', 'Нет окна');если окна нет - сообщение об ошибке и выход
	Exit
EndIf
WinActivate($hWin)
WinWaitActive($hWin)
$aClientSize = WinGetClientSize($hWin)
$aCord = PixelSearch(0, 0, $aClientSize[0], $aClientSize[1], 0xD7EAF9, 10, 3, $hWin)
If Not @error Then
	;MouseMove($aCord[0] + 5, $aCord[1], 1)
	MouseClick('left', $aCord[0] + 5, $aCord[1], 1, 1)
	Sleep(1000) ;только чтобы увидеть, переместилась мышка или нет.
	WinSetState($hWin, '', @SW_MINIMIZE)
Else
	MsgBox(16, 'Error', 'Error')
EndIf
 
Автор
C

chatnsk

Новичок
Сообщения
11
Репутация
0
Большое спасибо всем :IL_AutoIt_1:

Garrett, как я уже писал, это моё первое знакомство с AutoIt, так что я не совсем понял, что мне делать с Вашим примером) Точнее даже я примерно понял как это работает, но вот как применить это в моём случае....

madmasles, спасибо, этот пример заработал и у меня! Окно запускается, мышка перемещается и окно закрывает. Теперь бы понять, как не закрыть окно а нажать на кнопку :smile:
Согласно AutoIt Window Info координаты центра кнопки 555:460 в пределах окна.

И ещё, нельзя ли это окно лаунчера после нажатия кнопки как-то прятать? Чтобы процесс оставался запущенным, а окна небыло? :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
chatnsk [?]
я не совсем понял, что мне делать с Вашим примером
Это пример, чтобы вы поняли, почему вы не находите Button control.

В вашем случае нужно работать с координатами кнопки, или искать её по цвету пикселей.
Еще вам нужно не забывать о том, что размеры окна могут меняться, следовательно, координаты кнопки тоже.

И ещё, нельзя ли это окно лаунчера после нажатия кнопки как-то прятать?
Можно.
Код:
Run('notepad.exe')
WinWaitActive('[CLASS:Notepad]')
$hWin = WinGetHandle('[CLASS:Notepad]')
WinSetState($hWin, "", @SW_HIDE)
Sleep(3000)
WinSetState($hWin, "", @SW_SHOW)
 
Автор
C

chatnsk

Новичок
Сообщения
11
Репутация
0
Garrett, спасибо большое! Спрятать окно получилось! Осталось отловить кнопку)))
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
chatnsk
А если нажать (рукой) кнопку Enter при открытом окне, будут какие-то изменения?
 
Автор
C

chatnsk

Новичок
Сообщения
11
Репутация
0
madmasles
Нет, на энтер кнопка не реагирует, только на мышь...
Если ткнуть мышкой кнопку то запускается приложение дальше, как и должно быть...

Я даже умудрился опытным путём вычислить кнопку и нажать её, но столкнулся с очередной проблемой...
Если использовать код вот в таком виде:
Код:
Opt('MouseCoordMode', 2)
Opt('PixelCoordMode', 2)

$sTitle = 'SoulJI Launcher' ;заголовок окна
$sFileExe = @ScriptDir & '\launcher.exe' ;полный путь к exe-файлу

Run($sFileExe, @ScriptDir);запускаем приложение
$hWin = WinWait($sTitle, '', 5);ждем 5 сек. окно
If Not $hWin Then
    MsgBox(16, 'Error', 'Нет окна');если окна нет - сообщение об ошибке и выход
    Exit
EndIf
WinActivate($hWin)
WinWaitActive($hWin)
$aClientSize = WinGetClientSize($hWin)
$aCord = PixelSearch(0, 0, $aClientSize[0], $aClientSize[1], 0xD7EAF9, 10, 3, $hWin)
If Not @error Then
    MouseMove($aCord[0] - 56, $aCord[1]  + 449, 1)
    MouseClick('left', $aCord[0] - 56, $aCord[1] + 449, 1, 1)
    ;Sleep(100) ;только чтобы увидеть, переместилась мышка или нет.
    WinSetState($hWin, '', @SW_HIDE)
Else
    MsgBox(16, 'Error', 'Error')
EndIf

То экзешник открывается, а вот нажать кнопку скрипт не успевает, окно уходит в хайд.
Если же сделать паузу, т.е. убрать коммент со слипа, то тогда открывается экзешник, жмётся кнопка, но окно лаунчера не хайдится...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
chatnsk
А заголовок не меняется после нажатия на кнопку?
Может, так попробовать:
Код:
;...
If Not @error Then
    MouseClick('left', $aCord[0] - 56, $aCord[1] + 449, 1, 1)
    Sleep(100)
	$hWin = WinWait($sTitle, '', 5);или другой $sTitle если меняется
    WinSetState($hWin, '', @SW_HIDE)
Else
    MsgBox(16, 'Error', 'Error')
EndIf
 
Автор
C

chatnsk

Новичок
Сообщения
11
Репутация
0
madmasles, нет, после нажатия кнопки ничего не меняется. Код не помог. А нельзя как-то окно захайдить не по имени окна а по процессу? Предварительно дождавшись нажатия кнопки :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
chatnsk
Дайте ссылку на launcher.exe.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
chatnsk
Так у меня работает:
Код:
Opt('MouseCoordMode', 2)
Opt('PixelCoordMode', 2)

$sTitle = '[Title:SoulJI Launcher;Class:DirectUIHWND]' ;заголовок окна
$sFileExe = @ScriptDir & '\launcher.exe' ;полный путь к exe-файлу

Run($sFileExe);запускаем приложение
$hWin = WinWait($sTitle, '', 5);ждем 5 сек. окно
If Not $hWin Then
	MsgBox(16, 'Error', 'Нет окна');если окна нет - сообщение об ошибке и выход
	Exit
EndIf
WinActivate($hWin)
WinWaitActive($hWin)
$aClientSize = WinGetClientSize($hWin)
$aCord = PixelSearch($aClientSize[0] / 1.5, $aClientSize[1] / 1.5, $aClientSize[0], $aClientSize[1], 0xC8DFF3, 20, 5, $hWin)
If Not @error Then
	MouseClick('left', $aCord[0] + 5, $aCord[1], 1, 1)
	Sleep(100)
	WinSetState($hWin, '', @SW_HIDE)
	Sleep(2000)
	WinSetState($hWin, '', @SW_SHOW)
Else
	MsgBox(16, 'Error', 'Error')
EndIf
Так как мне нечего запускать, у меня появляется такое сообщение:
 
Автор
C

chatnsk

Новичок
Сообщения
11
Репутация
0
madmasles, у меня лаунчер запускает, кнопку тыкает, но окно лаунчера так и не хайдит :(
Если закомментить клик по кнопке, т.е. окно лаунчера остаётся активным - всё прекрасно работает, хайдит и через 2 секунды показывает опять.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
chatnsk
Так как у меня ему нечего запускать, у меня все срабатывает без проблем. Попробуйте увеличить паузу после MouseClick(), может он , пока не запустит то, что надо, не дает с собой ничего делать. Или отследить появление процесса или окна, которые он запускает, а потом его окно скрывать (а не "хайдить").
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
1. Запустить launcher.exe
2. Нажать кнопку "Start"
3. Спрятать окно auncher.exe
chatnsk я вас правильно понял?

Попробуйте так:
Код:
; Первый запуск активирует launcher.exe, второй,
; удаляет процесс launcher.exe, если он уже не нужен.
Opt('MouseCoordMode', 2)

If ProcessExists('launcher.exe') Then
	ProcessClose('launcher.exe')
	Exit
EndIf

; Предварительное позиционирование курсора
; для увиличения скорости срабатывания
MouseMove(@DesktopWidth/2, @DesktopHeight/2, 0)

Run('launcher.exe')
WinWaitActive('[CLASS:DirectUIHWND]')

If MouseClick("", 555, 464, 1, 0) Then
	WinSetState('[CLASS:DirectUIHWND]', '', @SW_HIDE)
EndIf
 
Верх