1

Тема: Как передать управление из JS в AHK?

Нужно чтобы после загрузки web-страницы выполнялся скрипт в AHK.
Есть идея реализовать это через JS+AHK.
В JS есть onLoad, но нужно как то, чтобы тут сработал скрипт AHK.
Думал может можно сэмулировать нажатие клавиш на клавиатуре с помощью JS - но я так понял что нельзя.
P.S. Браузер Опера.

2

Re: Как передать управление из JS в AHK?

По каким признакам определяется, что web-страница загружена? Окно программы развёрнуто?

3 (изменено: kirtech, 2011-05-02 19:41:30)

Re: Как передать управление из JS в AHK?

Из англоязычной справки:

Embedded Windows Scripting
VBScript, JScript, and Component Object Model (COM)
VBScript and JScript may be embedded in a script via Windows Scripting for AutoHotkey, which also provides access to COM.
Also, COM may be used directly via DllCall as demonstrated at www.autohotkey.com/wiki/index.php?title=COM_Wrappers .

C VBScript и JScript я не знаком

4

Re: Как передать управление из JS в AHK?

OFF: kirtech, это обратный путь, как использовать VBScript/JScript посредством Microsoft Script Control из-под AHK [т.е., это вовсе не «Windows Scripting», заявленный в заголовке по ссылке], либо же напрямую вызывая функции Automation.

5

Re: Как передать управление из JS в AHK?

ypppu пишет:

По каким признакам определяется, что web-страница загружена? Окно программы развёрнуто?

я сам в JS не силен, но вот пример реализации:

 window.onload = function(){ 
    "действия по передаче управления AHK"
  }

Пытался найти как на JS сэмулировать нажатие клавиш клавиатуры, но так понял , что это не возможно из-за политики безопасности.
Может еще как-то по другому можно реализовать?

Окно программы развернуто )

6

Re: Как передать управление из JS в AHK?

Я не пользуюсь Opera, поэтому и спрашиваю: как Вы узнаёте, что страница уже загрузилась? Там индикатор какой-нибудь или другие признаки?

7 (изменено: shayah, 2011-05-02 23:31:07)

Re: Как передать управление из JS в AHK?

ypppu пишет:

Я не пользуюсь Opera, поэтому и спрашиваю: как Вы узнаёте, что страница уже загрузилась? Там индикатор какой-нибудь или другие признаки?

Там внизу страницы появляется так называемая полоса загрузки, которая по окончании загрузки страницы пропадает.
http://i043.radikal.ru/1105/37/7fdff07d1d21t.jpg

Вроде нашел решение! На JS делаем алерт после полной загрузки страницы, а AHK c помощью IfWinActive отлавливает это окно, жмет enter и дальше уже делает, что нужно )

8

Re: Как передать управление из JS в AHK?

Тогда можно при помощи команды ImageSearch провести поиск фрагмента этой полосы загрузки, например "Отправка запроса на". Если ничего не найдено, значит полосы загрузки нет. Следовательно, страница загрузилась.

9

Re: Как передать управление из JS в AHK?

ypppu пишет:

Тогда можно при помощи команды ImageSearch провести поиск фрагмента этой полосы загрузки, например "Отправка запроса на". Если ничего не найдено, значит полосы загрузки нет. Следовательно, страница загрузилась.

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

10

Re: Как передать управление из JS в AHK?

Detect when a page is loaded

или

WinGetTitle, заголовок_окна_Оперы, ahk_class OperaWindowClass
временный_заголовок:="страница не загружена"
MsgBox, % заголовок_окна_Оперы
SetTimer, проверим_обновление_заголовка, 2000
Return

проверим_обновление_заголовка:
SetTimer, проверим_обновление_заголовка, Off
WinGetTitle, заголовок_окна_Оперы, ahk_class OperaWindowClass
if (заголовок_окна_Оперы=изменённый_заголовок) ; изменённый нами прежде заголовок обновился
{
	MsgBox, Страница обновлена
	изменённый_заголовок=
}
else if заголовок_окна_Оперы not Contains % временный_заголовок
{
	WinSetTitle, %заголовок_окна_Оперы%, ,%заголовок_окна_Оперы% . %временный_заголовок%
	изменённый_заголовок:=заголовок_окна_Оперы
}	
SetTimer, проверим_обновление_заголовка, On
Return

11

Re: Как передать управление из JS в AHK?

Значит состояние (загрузки) можно определить из заголовка окна?

12

Re: Как передать управление из JS в AHK?

Грубый, но простой способ.
Когда-то писал бота для одной онлайн игры. Пользовался Firefox 3. У него был такой скин, что кнопка "обновить" и "остановить" были совмещены. Я выбирал координату на этой кнопке, что бы цвет этого пикселя был разный при загрузке страницы и после ее окончания. (При наведении курсора на эту кнопку она не меняла свой цвет, это важно)

Win+1 определить координаты и цвет пикселя, полученный результат вставить в начало скрипта вместо имеющихся данных.
F1 запустить скрипт.

!!! В Firefox 4 эта кнопка тоже совмещена, и при наведении курсора на нее, она меняет свой цвет, поэтому способ определения координат через Win+1 не подойдет, если в опере кнопка такая же. Надо использовать скрипт без наведения курсора. Но это уже мелочи, если скрипт такой подойдет, разовьем тему

col_rdy := "0xFCFAF8" 
pos_rdyX := "1270" 
pos_rdyY := "13"

F1:: ; запуск цикла
FFready(col_rdy,pos_rdyX,pos_rdyY) ; ждем загрузки страницы
return


FFready(col,pixX,pixY) 
{
    Loop 
    {
        WinActivate, ahk_class MozillaUIWindowClass ; ТУТ вписать ahk_class для Оперы
        PixelGetColor, OutputVar, %pixX%, %pixY%  
        if (outputvar = col)
        {
            ToolTip ready
            ;~ break ; раскомментировать для практических целей, что бы цикл завершался
        }
        if (outputvar <> col)
        {
            ToolTip NOT Ready
            sleep, 100
        }
    }
}

#1:: ; запись переменных
    Gui, destroy
    coordmode mouse
    MouseGetPos, PixX, PixY, 0
    PixelGetColor, PixCol, PixX, PixY
    Gui, Add, Text,, Значения переменных
    Gui, Add, Edit, , col_rdy := "%PixCol%" `npos_rdyX := "%PixX%" `npos_rdyY := "%PixY%"
    GUI, SHOW, AutoSize Center
return

13

Re: Как передать управление из JS в AHK?

Спасибо всем за участие. Но я все сделал по своей задумке.
Использую Оперу, так вот в ней есть поддержка пользовательских скриптов (user-JS), которые автоматически выполняются после загрузки страницы. Причем в данных user-JS можно указать сайты, на которых скрипт будет действовать и на каких нет.

Код user JS скрипта:

// ==UserScript==
// @include сайт, на котором скрипт будет работать
// ==/UserScript==

window.open('http://www.google.ru/','','');

Далее AHK просто отлавливает открытие вкладки google и выполняет нужные действия.
Вырезка из кода:

...
WinWait, Google - Opera
if ErrorLevel
{
    MsgBox, Not loaded.
    return
}
else
{
Send, ^{sc011}
Sleep, 300
и т.д.
...
}