Тема: AHK: Chrome.ahk. Обратная связь со страницей.
Всем добра!
Подскажите пожалуйста, есть ли возможность организовать обратную связь со страницей? Например, можно ли "присоединиться" к событиям страницы, так, чтобы они вызывали AHK-функции. Как например, это делается в ActiveX-контроле - получается элемент из разметки и генерируемые им события вызывают соответствующие функции, связываемые через ComObjConnect().
Слегка модифицированный файл из примеров, идущих в "коробке" с файлом класса:
#NoEnv
#SingleInstance, Force
SetBatchLines, -1
#Include ../Chrome.ahk
; --- Create a new Chrome instance ---
addr1 := "https://autohotkey.com/"
addr2 := "https://autohotkey.com/boards/viewtopic.php?f=6&t=42890"
chPath := "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
profileName := "ChromeProfile"
recycleProfile := true ; Удаляет профиль после завершения работы
showEvalResult := false ; Показывает возвращаемый результат вызова
; PageInst.Evaluate() в MsgBox
FileCreateDir, %profileName%
ChromeInst := new Chrome(profileName, addr2,"--no-first-run", chPath)
informerCode :=
(LTrim Join`s
"function handlerF(ev) {
info.innerHTML = ``${ev.clientX}x ${ev.clientY}y``;
}
var body = document.querySelector('body');
var info = document.createElement('div');
info.id = 'info';
info.style.position = 'fixed';
info.style.top = '10px';
info.style.right = '10px';
info.style.width = '200px';
info.style.border = '2px solid #fff';
info.style.color = '#fff';
info.style.fontWeight = 'bold';
info.style.fontSize = '20px';
info.style.textShadow = '1px 1px 1px #000, 1px -1px 1px #000, -1px -1px 1px #000, -1px 1px 1px #000';
info.style.textAlign = 'center';
body.appendChild(info);
info.innerHTML = 'Click on the page';
body.addEventListener('click', handlerF);"
)
; --- Connect to the page ---
if !(PageInst := ChromeInst.GetPage()) {
MsgBox, Could not retrieve page!
ChromeInst.Kill()
GoSub, CloseMe
} else {
Gui,Input: Margin, 10, 10
Gui,Input: +Hwndinput_h
Gui,Input: Add, Button,gEvalMe,Запустить
Gui,Input: Add, Text,x+10 yp+5,Запускает JS-сценарий на странице:
Gui,Input: Font, s10 Bold, Consolas
Gui,Input: Add, Edit,xm y+7 w600 r20 vmyCode cBlue,alert('Hello World!!!');
Gui,Input: Font
Gui,Input: Add, Button,xm y+5 gAddInform,Click informer
Gui,Input: Add, Button,x+10 gCloseMe,Выход
Gui,Input: Show,,Ввод
}
return
EvalMe:
Gui,Input: Submit, NoHide
if (myCode == "")
return
GoSub, EvaluateHim
return
AddInform:
myCode := informerCode
GoSub, EvaluateHim
return
EvaluateHim:
try
Result := PageInst.Evaluate(myCode)
catch e
{
MsgBox, % "Exception encountered in " e.What ":`n`n"
. e.Message "`n`n"
. "Specifically:`n`n"
. Chrome.Jxon_Dump(Chrome.Jxon_Load(e.Extra), "`t")
} if (showEvalResult)
MsgBox, % "Result:`n" Chrome.Jxon_Dump(Result, "`t")
return
CloseMe:
InputGuiClose:
; --- Close the Chrome instance ---
try
PageInst.Call("Browser.close") ; Fails when running headless
catch
ChromeInst.Kill()
PageInst.Disconnect()
fPath := Format("{1}\{2}",A_ScriptDir,profileName)
if (recycleProfile) {
FileRemoveDir,% fPath, 1
i := 0
while (i < 10, i++) {
Sleep, 1000
if (FileExist(fPath))
FileRemoveDir,% fPath, 1
else
break
}
}
ExitApp
Здесь, на загруженную страницу, при нажатии кнопки "Click informer" инжектится обработчик кликов в теге "body", отображающий их координаты в зафиксированном справа-сверху div'е. Как при клике вызвать AHK-функцию и передать ей эти координаты, например, показав их в MsgBox?
В коде класса, начиная с 310 строки описано подключение к событиям, но я не уверен, что правильно понимаю, что это действительно так и если это всё же так, то не улавливаю связь. Нуждаюсь в помощи.