1 (изменено: Skare, 2010-10-21 16:37:47)

Тема: AHK: Проверка на заполненость строки

http://s39.radikal.ru/i083/1010/d6/c20f21d57504.png
Собственно, как, с помощью AHK, распознать что в этой строке что-то находится?(не важно что именно) И если там что-то есть-выполнить определённую задачу(If строка не пустая  {...}).
Или может как-нибудь можно через AHK определить, что страница в Internet Explorer загрузилась?:)

2

Re: AHK: Проверка на заполненость строки

Есть тема на форуме Autohokey, и в ней есть скрипт iWebBrowser2 Learner, он может помочь с управлением IE окон.

А для определения статуса IE, можно попробовать через считывание строки состояния - т.е. statusbar.

SetTitleMatchMode, 2

Loop {
    StatusBarGetText, SBtext, 1, Internet Explorer
    If (SBtext="Ready"||SBtext="Готово")
        Break
    Sleep 50
}

MsgBox Страница загружена

3 (изменено: Skare, 2010-10-21 22:41:03)

Re: AHK: Проверка на заполненость строки

Вот только в этой строке данные появляются уже после того, как в статус баре будет "готово" и каждый раз по разному(зависит от того, как сильно лагает сайт).
Ну или может можно сделать так, что бы проверяло, есть ли в этой строке заданное мною число, если есть то делать что-нибудь...
Как назначить эту проверку, именно этого окна?:)

4 (изменено: ayosh, 2010-10-22 01:45:09)

Re: AHK: Проверка на заполненость строки

Значит поле ajax'ом подгружается. Тогда javascript'ом вытаскивать значение окна браузера, т.е. value данного поля. Можно сделать с помощью той библиотеки, ссылку на которую я дал в предыдущем посте.

5

Re: AHK: Проверка на заполненость строки

Не совсем понял как именно применить библикотеку.:|

6

Re: AHK: Проверка на заполненость строки

Сделал тестовый скрипт используя COM.ahk (COM.zip)
Крайне полезная тема: Basic Webpage Controls with JavaScript / COM

#NoEnv
#Include COM.ahk ; из архива http://www.autohotkey.net/~Sean/Lib/COM.zip | тема http://www.autohotkey.com/forum/viewtopic.php?t=22923
SetBatchLines, -1
OnExit, exsub

Run, iexplore.exe ; запускаем IE

; сайты для тестов, js
site1 := "http://yandex.ru/"
site2 := "http://google.ru/"
js1 := "document.getElementByID[sbtn].value" ; значение по ID элемента
js2 := "document.getElementsByTagName[input].item[2].value" ; значение из 2-го элемента input
js3 := "document.getElementsByName[btnG].item[1].value" ; значение элемента по параметру name

COM_CoInitialize()
COM_Error(0) ; отключаем сообщения об ошибках

Loop 5 ; 5 попыток
{
    pwb := GetWebBrowser() ; получаем ссылку к объекту IE | pwb := IEGet("http://www.yandex.ru/") - альтернатива, если окно уже существует
    Sleep 1000
    If pwb
        Break
}
If !pwb
    ExitApp

COM_Invoke(pwb, "Navigate", site1) ; перейдём на яндекс
While, COM_Invoke( pwb, "ReadyState" ) <> 4 ; ожидаем полной загрузки
    Sleep 50

value1 := COM_Invoke(pwb, js1) ; получаем значение value
value2 := COM_Invoke(pwb, js2)

COM_Invoke(pwb, "Navigate", site2) ; идём на гугл
While, COM_Invoke( pwb, "ReadyState" ) <> 4 ; ожидаем полной загрузки
    Sleep 50

value3 := COM_Invoke(pwb, js3)
MsgBox %js1% - %site1%:`n%value1%`n`n%js2% - %site1%:`n%value2%`n`n%js3% - %site2%:`n%value3%

exsub:
COM_Release(pwb)
COM_CoUninitialize()
ExitApp
Return

GetWebBrowser() ; http://www.autohotkey.com/forum/viewtopic.php?p=155900#155900
{
   ControlGet, hIESvr, hWnd, , Internet Explorer_Server1, ahk_class IEFrame
   If Not   hIESvr
      Return
   DllCall("SendMessageTimeout", "Uint", hIESvr, "Uint", DllCall("RegisterWindowMessage", "str", "WM_HTML_GETOBJECT"), "Uint", 0, "Uint", 0, "Uint", 2, "Uint", 1000, "UintP", lResult)
   DllCall("oleacc\ObjectFromLresult", "Uint", lResult, "Uint", COM_GUID4String(IID_IHTMLDocument2,"{332C4425-26CB-11D0-B483-00C04FD90119}"), "int", 0, "UintP", pdoc)
   IID_IWebBrowserApp := "{0002DF05-0000-0000-C000-000000000046}"
   pweb := COM_QueryService(pdoc,IID_IWebBrowserApp,IID_IWebBrowserApp)
   COM_Release(pdoc)
   Return   pweb
}
IEGet( name="" ) ; http://www.autohotkey.com/forum/viewtopic.php?t=51020
{
   IfEqual, Name,, WinGetTitle, Name, ahk_class IEFrame ; Get active window if no parameter
   Name := ( Name="New Tab - Windows Internet Explorer" ) ? "about:Tabs" : RegExReplace( Name, " - (Windows|Microsoft) Internet Explorer" )
   oShell := COM_CreateObject( "Shell.Application" ) ; Contains reference to all explorer windows
   Loop, % COM_Invoke( oShell, "Windows.Count" ) {   
      If pwb := COM_Invoke( oShell, "Windows.item[" A_Index-1 "]" )
         If ( COM_Invoke( pwb, "LocationName" ) = name && InStr( COM_Invoke( pwb, "FullName" ), "iexplore.exe" ) )
            Break
      COM_Release( pwb ), pwb := ""
   }
   COM_Release( oShell )
   Return, pwb
}