1 (изменено: MandarinKa02, 2019-03-29 03:43:23)

Тема: AHK: передача массива из javascript в AHK

Вычитал на форумах, что это дело нужно провернуть при помощи COM. Примеров, как получить объект - не нашел. Есть только, как его "отправить".

Gui, Add, ActiveX, w512 h512 vActiveX, Shell.Explorer
ActiveX.document.parentWindow.AHK:=Func("foo")
ActiveX.Navigate("about:<!DOCTYPE html><script>AHK([1,2,3],{1:[1,2,3]})</script>")
return

foo(param1,param2) {
msgbox % isObject(param1)
}

f1::reload

2

Re: AHK: передача массива из javascript в AHK

MandarinKa02 пишет:

Есть только, как его "отправить".

А что, у вас этот код работает?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

3 (изменено: KusochekDobra, 2019-03-29 12:52:30)

Re: AHK: передача массива из javascript в AHK

Внутри JS кода, объявите объект, над которым собираетесь проводить эксперименты, глобальным:


var dataJSON;

function buildData(d) {
    dataJSON = JSON.parse(d);
	// обработка полученных данных из AHK
}
function dumpData() {
    return JSON.stringify(dataJSON);
}

AHK код:


html := BuildHTML()

Gui, 1: Add, ActiveX, vwb, about:<!DOCTYPE html><meta http-equiv="X-UA-Compatible" content="IE=edge">
wb.Silent := true, ComObjError(false)

wb.document.open()
wb.document.write(html)
wb.document.close
;wb.refresh()

doc := wb.doc
win := doc.parentWindow

	; Отправить данные в документ.
		; Здесь приводится дополнительная обработка передаваемых данных,
		; содержащих true, false и null в закомментированном виде(["myTrue":"true"])
		; для получения значений оригинального типа, так как в AHK эти типы не поддерживаются.
win.buildData(RegExReplace(JSON.Stringify( {"data":[1,2,3],"myTrue":"true","myFalse":"false","myNull":"null"} ), """(true|false|null)""", "$1"))

	; Получить данные из документа
dump := JSON.Parse(win.dumpData())

Требуется JSON.ahk от teadrinker.

4 (изменено: MandarinKa02, 2019-03-29 13:54:28)

Re: AHK: передача массива из javascript в AHK

teadrinker,какой? Тот, что приложил?
Или тот, о котором в цитате идется? В таком случае, я не пробовал т.к не нужен, но по идее должен работать.

KusockekDobra, спасибо за ответ, но не совсем то. Вы вызываете из самого AHK, а у меня callback. (Допустим, при нажатии кнопки, вызываю функцию AHK())

Объясню поподробнее:
В JavaScript я присваиваю переменной AHK callback-функцию самого AHK.
Для того, чтобы в аргумент передать объект, я использую по всему коду JSON.stringify, что не очень удобно. Я хочу избавиться от лишних действий и довести код до ума.
До ума, подразумеваю следующее:

AHK("blablabla",["from",javascript"])

У меня было несколько вариантов:
Перед вызовом AHK(), переопределить эту переменную и задать функцию(js), которая обработает("стрингифует" ) все аргументы и уже после, вызвать основную функцию AHK().
(Тут все понятно, но я пошел дальше. Я захотел чтобы можно было вызвать AHK.сделаймнехорошо() ) Я этой переменной(AHK) приравнил класс с методами. И вроде все работает, но незадача. Объект/массив не передать.
Тут у меня пришли две мысли:
- com (что я вовсе не понимаю)
- опять обработчик перед вызовом. (но есть вопрос, как повесить обработчик на целый класс. В AHK это бы была функция __Call(). В js такого, вроде как, нет.)

5

Re: AHK: передача массива из javascript в AHK

P.S. пока писал придумал костыль. Передать json с названиями методов, сделать обработчик на каждый метод. (По примеру, что выше привел)

6

Re: AHK: передача массива из javascript в AHK

MandarinKa02 пишет:

teadrinker,какой? Тот, что приложил?
Или тот, о котором в цитате идется? В таком случае, я не пробовал т.к не нужен, но по идее должен работать.

Совсем запутали. Про какую цитату идёт речь?
Передавать объект из js в AHK в принципе не имеет смысла, они по-разному устроены.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

7

Re: AHK: передача массива из javascript в AHK

teadrinker пишет:

Совсем запутали. Про какую цитату идёт речь?

Прошу прощения.
Цитату, которой вы процитировали мой пост.
В общем, вот код:

#IfWinActive, ahk_class XLMAIN
;===================================================================================
F1::	; set values to Range("A1:B3") via SafeArray
SafeArray :=	ComObjArray(12, 3, 2)	; create a safe array. "12" means VT_VARIANT, "3" means 3 rows (1. dimension), "2" means 2 columns (2. dimension)

; Note: when building a SafeArray to assign to an Excel Range Value, it will be 0-based
Loop, 3	; 3 rows
{
	RowNum :=	A_Index-1
	Loop, 2	;  2 columns
	{
		ColNum :=	A_Index-1
		SafeArray[RowNum, ColNum] :=	"Row" RowNum +1  " Col" ColNum + 1
	}
}

oExcel :=	ComObjActive("Excel.Application")
oExcel.Range("A1:B3").value :=	SafeArray 	; set safe array to range object
return


;===================================================================================
F2::	; get values from Range("A1:B3") via SafeArray
oExcel :=	ComObjActive("Excel.Application")

SafeArray :=	oExcel.Range("A1:B3").value	; get safe array

;MsgBox %	SafeArray.MaxIndex(1)   ; get total rows (1. dimension)
;MsgBox %	SafeArray.MaxIndex(2)   ; get total columns (2. dimension)

; Note: when extracting the SafeArray, it will be 1-based
Loop %	SafeArray.MaxIndex(1) ; loop through every row
{
	CurRowNum :=	A_Index
	Loop %	SafeArray.MaxIndex(2)  ; loop through every column
		MsgBox,,, %	SafeArray[CurRowNum, A_Index], 1    ; get cell's value
}
return

P.S. у меня одного некорректно грузится офф.форум?

8

Re: AHK: передача массива из javascript в AHK

Передавать данные строкой, которую стрингифуете с любой стороны — наиболее универсально. Так как, как сказал выше teadrinker, с каждой стороны, это будут разные данные, схожие только в своей описательной части. Вызывать AHK-функции из JS, можно при помощи ComObjConnect(), подписав соответствующие функции на события, а события можно генерировать на стороне JS при помощи Event().

Не забывайте так же, что имеете дело с сильно урезанным браузерным движком, который не поддерживает множество новых WEB-стандартов и, вроде как, классы, в нём, тоже не поддерживаются. Но это можно обойти через прототипы. На Стаке есть годная инфа.

9

Re: AHK: передача массива из javascript в AHK

Понял, значит буду использовать json.

KusochekDobra пишет:

Не забывайте так же, что имеете дело с сильно урезанным браузерным движком, который не поддерживает множество новых WEB-стандартов и, вроде как, классы, в нём, тоже не поддерживаются. Но это можно обойти через прототипы. На Стаке есть годная инфа.

Хех, знаю это. То, что выше описывал, можно было бы провернуть при помощи Proxy. Но, спасибо.

+ offtop

если кому интересно, переписываю эту груду камней.
На мой взгляд, код выполнен не аккуратно и он одноразовый. Если понадобится вставить его посредине крупного проекта, то это не обойдется без дополнительных заморочек. Да и само окно можно только одно создать. Я же, сделал из этого всего класс.
Могу после всех операций поделиться результатом.

10

Re: AHK: передача массива из javascript в AHK

Конечно же делитесь. Для этого форум и существует.
Я, например, с большим интересом читаю беседы и пояснения, людей, понимающих то, зачем они это делают. Это не только альтернативная точка зрения, но за частую и открытие. А умеющие пользоваться поиском и имеющие схожие задачи, обзаведутся ещё одной опорой в своих изысканиях.

11 (изменено: MandarinKa02, 2019-04-01 00:27:24)

Re: AHK: передача массива из javascript в AHK

Собственно, вот: https://files.fm/f/2xа5рnоу. (Спасибо Malcev'у за интересный сайтик)

==========================================================
В чем отличия от основного кода.

  • классы, экземпляры классов - это удобно

  • поправлена функция AHK_attach() - ниже заметка 1

  • есть возможность прикрутить класс для callback'а- заметка 2

  • [JS]присутствует несколько знакомых функций из AHK

Единственный минус: несколько непонятных мне функций(я их в самый низ убрал). Не знаю, что они делают и как их правильно вписать в новый код.

+ Заметки

1* в основном коде, "аттач" происходит при каждом клике. Для этого создается хук на нажатие мыши, что уже является не хорошим тоном.

~LButton:: ;//cheap fix to reattach JS_AHK
gosub,__Webapp_JS_AHK_Attach
return

В моем же случае, аттач происходит после прогрузки страницы. Если такового и не произошло, то можно принудительно вызвать js_AttachAHK()

2* Пример в архиве

P.S. не знаю, нужно ли создавать отдельную тему по этому поводу. Дайте знать.

P.P.S. я приложил файлик _commands.ahk. В нем переписаны "команды" в функции. Есть ли, может, у кого все переписанные команды?

12 (изменено: wladkokopops, 2019-04-10 08:49:24)

Re: AHK: передача массива из javascript в AHK

ComObjError(false) 
whr := ComObjCreate("WinHttp.WinHttpRequest.5.1") 
whr.Open("POST", "https://api.vk.com/method/messages.getHistory?count=" count "&chat_id=" ID "&access_token=" Token "&v=5.85", true) 
whr.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36") 
whr.SetRequestHeader("Content-Type","application/x-www-form-urlencoded") 
whr.Send() 
whr.WaitForResponse() 
jsontext := % whr.ResponseText
JSON = 
(LTrim Join
%jsontext% 
) 
htmldoc := ComObjCreate("htmlfile") 
Script := htmldoc.Script 
Script.execScript(" ", "JScript") 
oJSON := Script.eval("(" . JSON . ")")
date := % oJSON.response.items.0.date
text := % oJSON.response.items.0.text 
from := % oJSON.response.items.0.from_id 
idsms := % oJSON.response.items.0.id

Чем вам не тот самый код для Post запроса и разбора JSON ответа?
или не то нужно? Можно и без запроса.