1

Тема: AHK: Копирование текста из скрытых окон

Здравствуйте. Появилась потребность написать скрипт для копирования части текста из определенной области свернутого(или скрытого) окна. Попытка, представленная ниже, не увенчалась успехом. Возможно ли вообще это сделать, и, если да, прошу подсказать направление, в котором стоит думать, или, может быть, указать на ошибку в скрипте.
Условный вид скрипта: (Смысл - есть выделение фрагмента текста и его копирование (посредством Ctrl+C) в буфер)


F1::
ControlClick, D X375 Y220, AAA - Google Chrome
ControlClick, U X760 Y390, AAA - Google Chrome   
ControlSend ^{vk43}, AAA - Google Chrome 
return

2

Re: AHK: Копирование текста из скрытых окон

ControlSend,, ^a{sleep 20}^c, ahk_exe firefox.exe

3

Re: AHK: Копирование текста из скрытых окон

stealzy, спасибо, но такой способ выделяет слишком большие объемы текста. Мне необходима именно определенная область окна, как я писал выше. Предложенный вами способ был мной опробован ранее.

4

Re: AHK: Копирование текста из скрытых окон

stealzy, она определена координатами, представленными в примере скрипта.

5

Re: AHK: Копирование текста из скрытых окон

Здравствуйте.
Ваш пример пытается продемонстрировать захват области, но у свёрнутых окон её нет, если мне не изменяет память, а для скрытых, возможно должна быть определена директива в секции автовыполнения:


DetectHiddenWindows, On

6 (изменено: stealzy, 2017-06-04 01:18:21)

Re: AHK: Копирование текста из скрытых окон

В вашем скрипте между нажатием и отжатием не хватает передачи окну сообщений движения курсора (WM_MOUSEMOVE = 0x200) с помощью PostMessage.
А можно так:

ControlClick,, ahk_exe firefox.exe,,,3, NA x480 y330
sleep 100
ControlSend,, +{Down}+{End}, ahk_exe firefox.exe

KusochekDobra, со скрытыми окнами мимо.

7

Re: AHK: Копирование текста из скрытых окон

KusochekDobra, спасибо, информация про свернутые окна может оказаться полезной, её я не знал.
По поводу разрешения директивы, для функции Send, ControlSend и других некоторых, она не обязательна. Тем не менее, я решил попробовать все варианты, включая еще раз попробовать вариант, представленный ответчиком выше


ControlSend, , ^{vk41}{sleep 20}^{vk43}, AAA - Google Chrome

как с включенной, так и с не упомянутой директивами. Из всех вариантов, единственным рабочим оказался вариант копирования через обычный Send или MouseClickDrag с предварительным открытием окна. Отсюда следует, что я, видимо, не понимаю принципа работы ControlSend и ControlClick, несмотря на прочитанные описания в Справке, как на русском, так и на английском языках, и некоторой дополнительной информации из сети.
В любом случае, спасибо за указание на ошибку при работе со свернутыми окнами.

8

Re: AHK: Копирование текста из скрытых окон

stealzy, спасибо за указания! Буду разбираться дальше.

9 (изменено: stealzy, 2017-06-04 02:06:23)

Re: AHK: Копирование текста из скрытых окон

alekstankist111, как оказалось, предложенные мной способы работают в firefox, но не в хромых.
Хромы не воспринимают ввод в неактивное окно.

Вообще, сайт и блок в студию. Никто не копирует текст из браузера, чтобы получить контент с сайта.

10

Re: AHK: Копирование текста из скрытых окон

stealzy, вот, я тоже заметил, что в хроме не работает. ТОгда завтра установлю мозилу, проверю работу, и если всё сложится, закрою тему.

11 (изменено: alekstankist111, 2017-06-04 17:13:54)

Re: AHK: Копирование текста из скрытых окон

stealzy, к сожалению, в IE тоже не работает, по крайней мере, PostMessage.
Сайт ВК, требуется копировать сообщение (и, в дальнейшем, вставлять его в текстовый файл, но с этим проблем нет).
Есть другие способы? Основная загвоздка в том, чтобы делать это мгновенно, сразу после получения сообщения. Сам механизм такого реагирования меня не интересует, с ним я справляюсь, основную проблему представляет именно копирование из области скрытого окна.


F1::
WinHide, AAA - Internet Explorer
ControlClick, D X375 Y220, AAA - Internet Explorer
sleep, 1
PostMessage, 0x200,,,, AAA - Internet Explorer
sleep, 1
ControlClick, U X760 Y390, AAA - Internet Explorer  
sleep, 1
ControlSend ^{vk43}, AAA - Internet Explorer
return

12 (изменено: stealzy, 2017-06-04 17:26:30)

Re: AHK: Копирование текста из скрытых окон

Я писал про firefox, у меня там все работает.
У vk есть API, тут даже есть темы про работу с ним.
А еще можно через WinHttp:

vkid := "id123456789", login := "+79876543210", pass := "p@ssword"

; Константы, используемые в WinHttpRequest
global WinHttpRequestOption_EnableRedirects := 6, WinHttpRequestOption_MaxAutomaticRedirects := 14, WinHttpRequestOption_EnableHttpsToHttpRedirects := 12

; Создаём объект для запросов по HTTP протоколу
global oHttpRequest := ComObjCreate("WinHttp.WinHttpRequest.5.1")
;Включаем автоматические редиректы
oHttpRequest.Option(WinHttpRequestOption_EnableRedirects) := -1
;Включаем автоматические редиректы с HTTP на HTTPS
oHttpRequest.Option(WinHttpRequestOption_EnableHttpsToHttpRedirects) := -1
;Выставляем максимальное количество редиректов
oHttpRequest.Option(WinHttpRequestOption_MaxAutomaticRedirects) := 20

writeLn("Загружаем основную страницу сайта")
; Загружаем основную страницу входа
oHtmlDoc1 := documentFromURL("https://vk.com/")
writeLn("Получаем первую форму")
; Получаем первую по счёту форму
oForm := oHtmlDoc1.forms[0]
; Заполняем в форме поле email и пароль
oForm["email"].value := login
oForm["pass"].value := pass
; Эмулируем отправку формы
submitForm(oForm)
; Проверяем - есть ли в тексте сообщение о том, что авторизация прошла успешно
if (InStr(oHttpRequest.ResponseText, "LoginDone") <= 0) {
	MsgBox % "Авторизация не удалась ! Проверьте логин и пароль"
	Exit
}
; Загружаем страницу профиля
oHtmlDoc2 := documentFromURL("https://vk.com/" vkid)
; Получаем ссылку на наш основной профиль и "переходим по ней"
; oHtmlDoc := documentFromURL(oHtmlDoc2.GetElementByID("l_pr").left_row)
; Выводим текст из блока с именем и фамилией
MsgBox % oHtmlDoc2.GetElementByID("page_info_wrap").innerText
Return

; Функция загрузки и построения документа с указанного URL
documentFromURL(sURL) {
	writeLn("documentFromURL")
	writeLn("   URL: " . sURL)
	oHttpRequest.Open("GET", sURL, false)
	oHttpRequest.Send()
	return documentFromHTML(oHttpRequest.responseText, sURL)
}
; Функция создания документа из HTML кода
documentFromHTML(ByRef sHTMLCode, ByRef sBaseURL) {
	writeLn("documentFromHTML")
	writeLn("   Base URL: " . sBaseURL)
	; Создаём объект для парсинга HTML кода
	oDoc := ComObjCreate("htmlfile")
	oDoc.open()
	; Вставляем базовый тэг чтобы у относительных ссылок была верная адрессация от базового адреса
	oDoc.write("<base href=""" . sBaseURL . """>")
	oDoc.close()
	;oDoc.write(sHTMLCode)
	oDoc.body.innerHTML := sHTMLCode
	return oDoc
}
; Функция эмулятор отправки формы
submitForm(ByRef oForm){
	writeLn("submitForm")
	; Получаем ссылку на объект Window от документа формы
	oScript := oForm.document.Script
	; Сборка строки запроса формы
	loop , % oForm.elements.length
	{
		i++
		if oForm.elements[i].name != ""
		{
			; Собираем значения полей формы в строку и кодируем их имена и значения
			sBody .= oScript.encodeURIComponent(oForm.elements[i].name) . "=" . oScript.encodeURIComponent(oForm.elements[i].value) . "&"
		}
	}
	StringLeft, sBody, sBody, StrLen(sBody)-1

	; Получаем текущий адрес на котором мы находимся (для заполнения referer и настройки свойства "action" формы )
	sCurrentURL := oHttpRequest.Option(1)
	; Для формы BASE hRef не срабатывает, поэтому искусственно вычисляем полный путь запроса формы
	oForm.action := buildURL(sCurrentURL,oForm.action)

	writeLn("   Referer: " . sCurrentURL)
	writeLn("   form action: " . oForm.action)
	writeLn("   Body: " . sBody)

	oHttpRequest.open("POST", oForm.action, false)
	; Указываем метод кодирования данных
	oHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
	; Выставляем Referer, дабы сайты не ругались, что мы себя плохо ведём.
	if sCurrentURL != ""
	{
		oHttpRequest.setRequestHeader("Referer", sCurrentURL)
	}
	; Отправляем данные формы
	oHttpRequest.send(sBody)
}
; Функция для построения полного пути из относительного для URL
buildURL(ByRef sBaseURL, ByRef sURL) {
	; Создаём HTML документ с единственной ссылкой
	oDoc := documentFromHTML("<a href=""" . sURL . """>", sBaseURL)
	; Берём href от этой ссылки.
	return oDoc.all.tags("a")[0].href
}
; Функция для вывода строки в консоль
writeLn(text){
	FileAppend % text "`n", *
}

13 (изменено: svoboden, 2017-06-04 19:58:13)

Re: AHK: Копирование текста из скрытых окон

Если речь идет об автоматизации браузеров, то, думаю, нужен JavaScript, по AutoHotkey можно только активировать пользовательский JavaScript.

14 (изменено: Malcev, 2017-06-06 02:33:30)

Re: AHK: Копирование текста из скрытых окон

alekstankist111 пишет:

ControlClick, D X375 Y220, AAA - Google Chrome

А где вы прочитали, что D может идти вторым параметром?

stealzy пишет:

В вашем скрипте между нажатием и отжатием не хватает передачи окну сообщений движения курсора (WM_MOUSEMOVE = 0x200) с помощью PostMessage

Работающий пример приведёте?
Гугл Хром у меня реагирует на отправление Shift+MouseClick, IE и Firefox же нет.
Не знаю почему.

F1::
winhide, Серый форум - Google Chrome
PostMessage, 0x201, 0x1, ((320<<16)^700),, ahk_id 0x13037a   ; id контрола=0x13037a
PostMessage, 0x202,, ((320<<16)^700),, ahk_id 0x13037a
PostMessage, 0x201, 0x4 | 0x1, ((620<<16)^500),, ahk_id 0x13037a
PostMessage, 0x202, 0x4, ((620<<16)^500),, ahk_id 0x13037a
winshow, Серый форум - Google Chrome
return

15 (изменено: stealzy, 2017-06-06 10:00:17)

Re: AHK: Копирование текста из скрытых окон

Malcev, это был чисто логический вывод, т.к. очевидно, что отправки двух сообщений вида: лкм зажата, лкм отжата в двух координатах недостаточно для выделения.
Ну вот, сходу написал, в моем firefox отлично работает даже без активации окна:

t := "ahk_exe firefox.exe"
CoordMode Mouse, Screen
MouseGetPos x, y
WinGetPos xW, yW,,, % t

PostMessage, 0x201, 1, % lParam(x-=xW, y-=yW),, % t
Loop 10
	PostMessage, 0x200, 0, % lParam(x+=20, y),, % t
PostMessage, 0x202, 0, % lParam(x, y),, % t

lParam(x, y) {
	Return lParam := x & 0xFFFF | (y & 0xFFFF) << 16 
}

Что интересно, работает даже для свернутого окна, но оно в этом случае активируется.

Malcev пишет:

winhide

Я испытывал для просто неактивного окна, но вы упустили DetectHiddenWindow On в вашем коде.
UPD: Скрытое winhide окно лисы проявляется при получении PostMessage. В любом случае, не думаю, что можно копировать из скрытого winhide окна. Есть и другие методы скрытия.

16 (изменено: Malcev, 2017-06-06 13:19:00)

Re: AHK: Копирование текста из скрытых окон

stealzy пишет:

Я испытывал для просто неактивного окна, но вы упустили DetectHiddenWindow On в вашем коде.

В моём коде он не нужен, так как PostMessage идет напрямую к контролу.
Да, действительно для Лисы нужно посылать PostMessage, 0x200.
И у меня при при посылке сообщений в скрытое окно лисы, оно не появляется:

DetectHiddenWindows on
winhide, ahk_id 0x60a58
PostMessage, 0x200, 0, ((320<<16)^700),, ahk_id 0x60a58
sleep 1
PostMessage, 0x201, 0x1, ((320<<16)^700),, ahk_id 0x60a58
sleep 1
PostMessage, 0x200, 0, ((620<<16)^800),, ahk_id 0x60a58
sleep 1
PostMessage, 0x202,, ((620<<16)^800),, ahk_id 0x60a58
return

С гуглхромом так не сработает и ему надо посылать shift+LClick:

F1::
winhide, Серый форум - Google Chrome
PostMessage, 0x201, 0x1, ((320<<16)^700),, ahk_id 0x13037a   ; id контрола=0x13037a
PostMessage, 0x202,, ((320<<16)^700),, ahk_id 0x13037a
PostMessage, 0x201, 0x4 | 0x1, ((620<<16)^800),, ahk_id 0x13037a
PostMessage, 0x202, 0x4, ((620<<16)^800),, ahk_id 0x13037a
return

С IE не работает ни один ни другой вариант.

17

Re: AHK: Копирование текста из скрытых окон

Malcev, вам то зачем эти костыли, когда есть Selenium, WinHttp, vk API?

18

Re: AHK: Копирование текста из скрытых окон

Ради спортивного интереса.

19

Re: AHK: Копирование текста из скрытых окон

Malcev Пример от stealzy http://forum.script-coding.com/viewtopi … 09#p116409 работает для firefox, а Ваш для Google Chrome нет.

20

Re: AHK: Копирование текста из скрытых окон

У меня работает.

21 (изменено: Malcev, 2017-11-03 16:31:23)

Re: AHK: Копирование текста из скрытых окон

Кстати, stealzy, у вас в 17 коде ошибка.
Вместо

PostMessage, 0x200, 0, % lParam(x+=20, y),, % t

Надо

PostMessage, 0x200, 0x1, % lParam(x+=20, y),, % t

С этим исправлением будет работать и в хроме и в интернет эксплорере.

22

Re: AHK: Копирование текста из скрытых окон

Вот это поворот! Оказывается команде движения курсора нужно передавать текущее состояние модификаторов и кнопок.
msdn — WM_MOUSEMOVE message parameters