1 (изменено: svoboden, 2017-06-07 02:22:12)

Тема: AHK: Клик по картинке

Вопрос по "Image Search". Есть скрипт, который прокручивает список видеофайлов на ютубе (т.е. кликает на иконку ">"):

array := [A_ScriptDir "\file.png"]

Loop % Array.MaxIndex()
{
    CoordMode, Pixel, Window
    ImageSearch, x, y, 40, 40, A_ScreenWidth, A_ScreenHeight, % array[A_Index]
    If ErrorLevel = 0
    ControlClick, % "x" x " y" y, ahk_class Chrome_WidgetWin_1
}
return

Работает все нормально, но когда курсор находится на миниатюре видеофайла, скрипт не работает. Что надо поправить в коде, чтобы скрипт работал? Спасибо!

2

Re: AHK: Клик по картинке

array := [A_ScriptDir "\file.png"]

Loop % Array.MaxIndex() 
{
    MouseGetPos, xpos, ypos 
    CoordMode, Pixel, Window
    ImageSearch, x, y, 0, 0, 1366, 768, % array [A_Index]
    If ErrorLevel = 0
    Click %x%, %y%
    MouseMove, %xpos%, %ypos%
    if ErrorLevel = 0
    ExitApp
}
return

3 (изменено: KusochekDobra, 2017-03-02 21:03:43)

Re: AHK: Клик по картинке

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


while (true) {
	
	if (GetKeyState("sc10")) { ; Кнопка Q
		while (GetKeyState("sc10"))
			Sleep, 10
		MouseGetPos, myX, myY
		;Send {sc1D down}	; Ctrl - открывать ссылки в новой вкладке
		SendLclk(myX, myY, Hget(myX, myY))	; Сообщает клик
		;Send {sc1D up}
	} else if (GetKeyState("sc11")) {  ; Кнопка W
		MouseGetPos, myX, myY
		SendWheel(myX, myY, Hget(myX, myY), 2, 1)
	} else if (GetKeyState("sc1F")) {  ; Кнопка S
		MouseGetPos, myX, myY
		SendWheel(myX, myY, Hget(myX, myY), 2, -1)
	} else if (GetKeyState("sc1E")) {  ; Кнопка A
		MouseGetPos, myX, myY
		SendHscroll(Hget(myX, myY), 0)
	} else if (GetKeyState("sc20")) {  ; Кнопка D
		MouseGetPos, myX, myY
		SendHscroll(Hget(myX, myY), 1)
	}
	sleep 50
}
; Для CoordMode, Mouse, Screen
SendLclk(new_x, new_y, varControl) {
	WinGetPos, hw_x, hw_y,,, ahk_id %varControl%
	l_param := % (new_x - hw_x) + ((new_y - hw_y) * 65536)
	SendMessage, 0x0201, 0x0001, %l_param%, , ahk_id %varControl%
	sleep 50
	SendMessage, 0x0202, 0x0000, %l_param%, , ahk_id %varControl%
}
SendRclk(new_x, new_y, varControl) {
	WinGetPos, hw_x, hw_y,,, ahk_id %varControl%
	l_param := % (new_x - hw_x) + ((new_y - hw_y) * 65536)
	SendMessage, 0x0204, 0x0002, %l_param%, , ahk_id %varControl%
	sleep 50
	SendMessage, 0x0205, 0x0000, %l_param%, , ahk_id %varControl%
}
; Скролит окно. По умолчанию вверх, со скоростью = speed. Вниз => последний параметр = -1
SendWheel(new_x, new_y, varControl, speed := 1, route := 1) {
	Scroll := (speed*100*route)<<16
	WinGetPos, hw_x, hw_y,,, ahk_id %varControl%
	l_param := % (new_x - hw_x) + ((new_y - hw_y) * 65536)
	SendMessage, 0x20A, %Scroll%, %l_param%, , ahk_id %varControl%
}
; Скролит окно. route = 0 - вправо, route = 1 - влево.
SendHscroll(varControl, route) {
	SendMessage, 0x114, %route%,,,ahk_id %varControl%
}
; Возвращает хендл окна по координатам
Hget(x, y) {
	return % DllCall("WindowFromPoint", "int64", x & 0x00000000FFFFFFFF | y<<32)
}

Кнопки, которые ожидаются в теле цикла - подписаны. Наводишь курсор на элемент, давишь кнопку, смотришь результат, модифицируешь под свои нужды.
Так же, есть официальное утверждение, что следует пользовать "PostMessage" вместо "SendMessage", так что стоит иметь это ввиду, если "что-то пойдёт не так". Но у меня в Chrome работает без проблем.

4

Re: AHK: Клик по картинке

KusochekDobra, спасибо, но я уже написал правильный ответ выше. Так сказать, сам задал вопрос, сам на него и ответил. http://s2.rimg.info/5602a4cac8909fc6c1ce0e23fa5bdb6d.gif.

5 (изменено: Malcev, 2017-03-02 23:19:00)

Re: AHK: Клик по картинке

В ControlClick есть параметры SetControlDelay и NA.
Можно с ними попробовать.
https://autohotkey.com/docs/commands/ControlClick.htm
А вообще зачем так сложно переключать видео?
У ютуба же есть шотркаты: +N, +P.

6 (изменено: svoboden, 2017-03-03 00:49:57)

Re: AHK: Клик по картинке

Malcev, нет, листать список видеофайлов кнопками не получится. А насчет ControlClick`а - я заменил его на обычный Click.

7

Re: AHK: Клик по картинке

Вот так будет работать без mousemove:

f1::
pToken := Gdip_Startup()
Gui, -Caption +E0x80000 +AlwaysOnTop +ToolWindow +hwndhGui
Gui, Show, NA

hbm := CreateDIBSection(A_ScreenWidth, A_ScreenHeight)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromHDC(hdc)
pBitmap := Gdip_BitmapFromScreen()
Gdip_DrawImage(G, pBitmap)
UpdateLayeredWindow(hGui, hdc, 0, 0, A_ScreenWidth, A_ScreenHeight)

SelectObject(hdc, obm)
DeleteObject(hbm)
Gdip_DisposeImage(pBitmap)
DeleteDC(hdc)
Gdip_DeleteGraphics(G)
Gdip_Shutdown(pToken)
ControlClick, x1700 y285, ahk_class Chrome_WidgetWin_1
Gui, Destroy
return

8 (изменено: svoboden, 2017-05-22 08:32:46)

Re: AHK: Клик по картинке

Это какой-то сложный способ, и у меня не запускается. Нашел проще с помощью iMacros'а.

9

Re: AHK: Клик по картинке

Чтобы запустилось нужна библиотека gdip.
Скрипт делает снимок экрана поверх всех окон, после чего хром реагирует на контролклик.