Что нового

Как правильно записать нажатие клавиш

forfrends

Новичок
Сообщения
176
Репутация
3
Не обязательно ждать пока окно станет активным, что бы послать "Enter"
Для неактивных окон есть команда:
Код:
ControlSend("название окна", "Видимый текст", "Название кнопки, или его ид", "то, что нужно послать, например {Enter}" ; имитетирует нажатие клавиш
ControlClick("название окна", "Видимый текст", "Название кнопки, или его ид") ; имитирует нажатие мышкой



Добавлено:
Сообщение автоматически объединено:

Например так:
Код:
ControlSend("Введите пароль", "Ok", "Ok", "{Enter}")



Добавлено:
Сообщение автоматически объединено:

Или так:

Код:
$s = ControlGetHandle("Введите пароль", "Ok", "Ok")
ControlSend("Введите пароль", "Ok",  $s, "{Enter}")
 
Автор
D

Dedok

Новичок
Сообщения
15
Репутация
0
Код:
If WinExists("Введите пароль") Then
 WinActivate ("Введите пароль")
 Send ("{ENTER}")
EndIf

Не срабатывает WinExist, ждёт активации окна.

Код:
ControlSend("Введите пароль", "Ok", "Ok", "{Enter}")

Не срабатывает, доходит до окна и чего-то ждёт, но и ошибок не выдаёт.
 

forfrends

Новичок
Сообщения
176
Репутация
3
дай скин окна где ентер нажать нужно


Добавлено:
Сообщение автоматически объединено:

Надо примерно так:

Код:
If WinExists("Введите пароль") Then
       ControlSend("Введите пароль", "Ok", "Ok", "{Enter}")
EndIf
 
Автор
D

Dedok

Новичок
Сообщения
15
Репутация
0
дай скин
http://www.steekr.com/n/50-17/share/LNK32284bcaf56c8e6c7/

Обратил внимание на такую деталь: Перед появлением окна ввода проскакивает очень быстро окно с прогресс баром подключения к базе, может оно мешает?
 

forfrends

Новичок
Сообщения
176
Репутация
3
Нет, дело не в прогрес баре.

судя по скрину окна программа должна выглядеть примерно так:

Код:
Sleep(3000) ; на всякий случай :)
WinWaitActive("Открытые дни")
If WinExists("Открытые дни") Then
       ControlSend("Открытые дни", "", "", "{Enter}")
EndIf



Добавлено:
Сообщение автоматически объединено:

Картинки лучше хранить здесь:
http://www.radikal.ru/
 
Автор
D

Dedok

Новичок
Сообщения
15
Репутация
0
Вот! Сработало!
И ключевым моментом стала пауза., причём срабатывает начиная с 5000.
Но машины, на которых стоит программа самых разных скоростей. Подбирать под каждую? И причём здесь пауза?
 

forfrends

Новичок
Сообщения
176
Репутация
3
Вообще-то паузу болжна выполнять команда WinWaitActive. Но если программа работает в фоне то WinWaitActive не сработает

Код:
While 1
    If WinExists("Открытые дни") Then
         Sleep(3000) ; дать позможность на окне появиться кнопке
         $s = ControlClick("Открытые дни", "", "Ok") ; имитация нажатия мышкой по кнопке Ок
         If $s = 1 Then ExitLoop ; проверка нажато Ок или нет, если нет - ждет пока не нажмется
    EndIf
WEnd


А если попробовать так
 
V

VitAl2013

Гость
Можно проверять не появление окна а какойто признак который возникает если окна не повляется. Например активизация, unhide какогото элемента. Потом сделать цикл, если элемент в hide, то ловим окно до посинения (условие посинения тоже надо бы задать, а то это будет бесконечность).
 

akoulev

Новичок
Сообщения
169
Репутация
2
Dedok сказал(а):
Вот, осилил ... Не исполняется, пишет ошибку:
"EndIf" statement with no matching "If" statement.: EndIf
И это - правильно! Ибо есть 2 варианта корректного написания:
1)
Код:
If WinExists("Введите пароль") Then Send ("{ENTER}")

2)
Код:
If WinExists("Введите пароль") Then 
    Send ("{ENTER}")
Else
    ;Ничего 
EndIf

Учти, что ТАК может и не работать. Ибо свой ("{ENTER}") Ты шлёшь в белый свет как в копеечку: сперва надо бы сделать текущим окно запроса пароля. С другой стороны, оно и так может быть текущим. А может и не быть. :smile: Для разрешения этой неоднозначности, я и рекомендую:
Код:
If WinExists("Введите пароль") Then 
    WinActivate("Введите пароль"); делаем активным
    WinWaitActive("Введите пароль"); дожидаемся выполнения запроса на активацию
    Send ("{ENTER}")
Else
    ;Ничего 
EndIf

Что характерно, и это благолепие имеет полное моральное право не работать. ;) Я бы, посредством программы AutoIt Window Info "посмотрел" название кнопки "Ok" (или что там есть для отправки пароля); и, далее, использовал что-то типа:
Код:
ControlClick ("PuTTY Configuration", "Load", "Button11")

(строчка из одного из моих скриптов: нажатие именно программной кнопки, - как она на данный момент числится в системе.)


Добавлено:
Сообщение автоматически объединено:

Dedok сказал(а):
Но машины, на которых стоит программа самых разных скоростей. Подбирать под каждую? И причём здесь пауза?
Пауза, понятно, на отработку. Но, вообще, использование пауз - тупиковый путь. Ибо, при росте числа скриптов, всё это 'хозяйство' неминуемо начинает 'расползаться': где-то "недождали"; где-то "переждали" - а итог один: в лучшем случае не работает; в худшем - работает неправильно. Лучше под каждую задержку писать крохотный "анализатор" ситуации, типа WinWaitActive.
 
Автор
D

Dedok

Новичок
Сообщения
15
Репутация
0
использование пауз - тупиковый путь..
Да, так и есть. Даже на одной машине паузы разные, при первой загрузке надо ждать 5000, а после хватает и 3000. Отказываемся от этого.

Не подскажите что тут индентификатор и что нажиматель?

>>>> Window <<<<
Title: Открытые дни
Class: TfmOpenDay
Position: 383, 317
Size: 257, 134
Style: 0x96C80000
ExStyle: 0x00000101
Handle: 0x009D00E8

>>>> Control <<<<
Class: TBitBtn
Instance: 1
ClassnameNN: TBitBtn1
Name:
Advanced (Class): [CLASS:TBitBtn; INSTANCE:1]
ID: 11338344
Text: OK
Position: 174, 80
Size: 75, 25
ControlClick Coords: 38, 13
Style: 0x5401000B
ExStyle: 0x00000000
Handle: 0x00AD0268

>>>> Mouse <<<<
Position: 598, 432
Cursor ID: 0
Color: 0:rofl:4D0C8

>>>> StatusBar <<<<

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
OK
1035


>>>> Hidden Text <<<<
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Код:
controlclick('Открытые дни','','[CLASS:TBitBtn; INSTANCE:1]')

:whistle:
 
Автор
D

Dedok

Новичок
Сообщения
15
Репутация
0
Код:
If WinExists("Введите пароль") Then 
    WinActivate("Введите пароль"); делаем активным
    WinWaitActive("Введите пароль"); дожидаемся выполнения запроса на активацию
    Send ("{ENTER}")
Else
    ;Ничего 
EndIf


Так не срабатывает, те выходит окно и стоит ждёт, видимо, вся эта конструкция с If срабатывает раньше. И дело не в {ENTER} тк
Срабатывает более простой вариант
Код:
WinWaitActive("Введите пароль"); дожидаемся выполнения запроса на активацию
    Send ("{ENTER}")


Если применить простую конструкцию, то что будет если ожидаемого окна не появится? Куда пробьётся {ENTER} в следующее окно?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Dedok [?]
Если применить простую конструкцию, то что будет если ожидаемого окна не появится? Куда пробьётся {ENTER} в следующее окно?

При появлении ожидаемого окна ф-я : WinWaitActive должна выдать его handle.
Если окно не появилось в течение установленного времени ф-я должна вернуть ошибку =0 .
Если время не установлено скрипт будет висеть и {ENTER} никуда не пробьется.
Можно задать время ожидания появления окна:
Код:
WinWaitActive("Введите пароль",'',5)

Через 5 сек если окно не появилось выдастся ошибка=0
 

Hellbender

Новичок
Сообщения
16
Репутация
0
Попробуй так:

Код:
$1 = WinWait('Введите пароль','',10) ;ждем появления такого окна
If $1 = True Then
    WinActivate('Введите пароль'); делаем активным
	Sleep(300)
    $2 = WinWaitActive('Введите пароль', '', 5); дожидаемся выполнения запроса на активацию, если не дождались - выход
	if $2 = True Then
	Sleep(100)
        Send ('{ENTER}')
        Else
            Exit
	EndIf
Else
    Exit
EndIf
 
Верх