1

Тема: 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 строки описано подключение к событиям, но я не уверен, что правильно понимаю, что это действительно так и если это всё же так, то не улавливаю связь. Нуждаюсь в помощи.

2

Re: AHK: Chrome.ahk. Обратная связь со страницей.

Пока не нашёл ничего лучше, чем подключить домен консоли:

PageInst.Call("Console.enable")

И отлавливать на событии "Message", в Chrome.Page.Event(), data.method == "Console.messageAdded":


if (data.method == "Console.messageAdded")
	ToolTip,% data.params.message.text