Что нового

WinWait срабатывает раньше появления окна

nsgenn

Новичок
Сообщения
52
Репутация
1
Привет, столкнулся с такой вещью, что WinWait начинает работать раньше, чем окно появляется на экране. В итоге нажатие Mouse1 происходят раньше чем положено. Понятно, что можно использовать
Код:
Sleep(nSecond)
, однако на разных машинах разная скорость появления скайпа и результатом может быть очень неприятное ожидание этого Слиип. Каким образом решается такого рода задача?

Код:
$Name = "WoW"
$Password = "password"
Run('C:\Program Files (x86)\Skype\Phone\Skype.exe')
 If WinWait("Skype", "", 5) Then
  $aPos = WinGetPos ( "Skype" )
  $aPos[0]+=210
  $aPos[1]+=185
  MouseClick ( "left", $aPos[0], $aPos[1], 50)
  Send($Name)
  $aPos[1]+=55
  MouseClick ( "left", $aPos[0], $aPos[1], 2)
  Send($Password)
  Send("{ENTER}")
  Else 
  MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
 EndIf


зы. И еще вопрос: почему с помощью WinInfo не получается распознать элементы для ввода логина и пароля в скайпе? Приложение воспринимает все окно как 1класс: "Internet Explorer_Server"
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
nsgenn [?]
Каким образом решается такого рода задача?
Код:
$hWnd = WinWait( "Skype", "", 5 )
If $hWnd Then
	WinActivate( $hWnd )
	WinWaitActive( $hWnd )
	...
EndIf



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

nsgenn [?]
зы. И еще вопрос: почему с помощью WinInfo не получается распознать элементы для ввода логина и пароля в скайпе? Приложение воспринимает все окно как 1класс: "Internet Explorer_Server"
Это объект IE в форме.
 
Автор
N

nsgenn

Новичок
Сообщения
52
Репутация
1
и ничего не изменилось (
http://www.youtube.com/watch?v=D7vj0Ri7BNc&feature=youtu.be
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
Global Const $Name = 'WoW'
Global Const $Password = 'password'

If Not Run('C:\Program Files (x86)\Skype\Phone\Skype.exe') Then
	MsgBox(4096, 'Сообщение', 'Файл не найден, завершаем работу скрипта.')
	Exit
EndIf

$hWnd = WinWait('[TITLE:Skype; CLASS:TLoginForm]', '', 5)
If Not $hWnd Then
	MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта.')
	Exit
EndIf

WinActivate($hWnd)

$Timer = TimerInit()
While BitAND(WinGetState($hWnd), 15) <> 15
	If TimerDiff($Timer) > 5000 Then
		MsgBox(4096, 'Сообщение', 'Ошибка инициализации окна, завершаем работу скрипта.')
		Exit
	EndIf
	Sleep(10)
WEnd

$aPos = WinGetPos($hWnd)
MouseClick('left', $aPos[0] + 210, $aPos[1] + 185, 1, 0)
ClipPut($Name)
Send('^v')
MouseClick('left', $aPos[0] + 210, $aPos[1] + 240, 1, 0)
ClipPut($Password)
Send('^v')
MouseClick('left', $aPos[0] + 360, $aPos[1] + 307, 1, 0)
ClipPut('')
 
Автор
N

nsgenn

Новичок
Сообщения
52
Репутация
1
разобрался! спасибо большое! )
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
На самом деле это проблема не с WinWait(), а с Aero в Windows 7. При разворачивании окна происходит анимация, которая требует некоторое время. Если ты запустишь Skype с нуля, а не из трея, то твой скрипт будет нормально отрабатывать. Подробнее об этом можно почитать здесь.
 
Автор
N

nsgenn

Новичок
Сообщения
52
Репутация
1
Yashied [?]
На самом деле это проблема не с WinWait(), а с Aero в Windows 7. При разворачивании окна происходит анимация, которая требует некоторое время. Если ты запустишь Skype с нуля, а не из трея, то твой скрипт будет нормально отрабатывать. Подробнее об этом можно почитать здесь.

вон оно что! Я так понимаю, что к примеру в GoogleCh такой способ не прокатит ( пример - окно открылось, а визуальные закладки не подгрузились )?
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Yashied [?]
На самом деле это проблема не с WinWait(), а с Aero в Windows 7. При разворачивании окна происходит анимация, которая требует некоторое время. Если ты запустишь Skype с нуля, а не из трея, то твой скрипт будет нормально отрабатывать. Подробнее об этом можно почитать здесь.
Если я не ошибаюсь то в данном случаи(при открытии из трея)скайп не создаст новое окно, а сделает просто видимым, т.к. окно скайпа создаться в момент запуска скайпа и не удаляется до закрытия процесса
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
winstan сказал(а):
Если я не ошибаюсь то в данном случаи(при открытии из трея)скайп не создаст новое окно, а сделает просто видимым, т.к. окно скайпа создаться в момент запуска скайпа и не удаляется до закрытия процесса

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

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
nsgenn
Можно добавить проверку ввода:
1. Очистить буфер обмена (можно кэшировать его для восстановления)
2. Выслать Ctrl+Shift+Стрелка влево (чтобы выделить текст)
3. Выслать Ctrl+Ins (чтобы скопировать выделенное в буфер обмена)
4. Получить содержимое буфера и сравнить с вставляемым текстом.
5. Восстановить предыдущий буфер обмена вставкой кэшированного.

Оформить в виде функции и при возврате "Ошибка=1" сделать паузу 100 мс и снова пытаться вставить. Делается цикл на 10 попыток (10*100 = 1 сек), при удаче вылет из цикла, при не удаче, выдать ошибку и завершить.
 
Автор
N

nsgenn

Новичок
Сообщения
52
Репутация
1
Я еще подумал - можно цвет пары контрольных пикселов проверять, как вариант. Идентификация пикселя вообще затратный для процессора процесс?

зы. Да и кстати: В первом варианте исходника независимо от того свернута программа или вообще не запущена - код выполняется раньше чем положено. При запуске даже намного раньше
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Я так понимаю требуется автоматизировать авторизацию?
Попробуйте этот простейший способ:
Код:
Global Const $Name = 'WoW'
Global Const $Password = 'password'

If Not Run('C:\Program Files (x86)\Skype\Phone\Skype.exe /secondary /username:'&$Name&' /password:'&$Password) Then
    MsgBox(4096, 'Сообщение', 'Файл не найден, завершаем работу скрипта.')
    Exit
EndIf


Для работы со Skype вдальнейшем можно использовать api.
Информацию по использованию API можно найти в интернете или в моём архиве.
Skype_API_b_script_help.zip / mirror / mirror2 (1.8 МБ)
 
Верх