1

Тема: AHK: Аналог PixelGetColor для перекрытого окна

Приветствую!
Имею данную функцию (*пример):

PixelGetColor, color, 1249, 1037, alt
if (color = 0x3921E7)
{
SoundBeep, 150, 300
Pause
Goto, Label1
}

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

Всех благ!

2

Re: AHK: Аналог PixelGetColor для перекрытого окна

AHK: Возможно ли получить цвет пикселя неактивного окна

3

Re: AHK: Аналог PixelGetColor для перекрытого окна

ypppu
Перепробовал все варианты из этой темы, как и говорил, хотелось бы увидеть на точном примере рабочий вариант, если у ahk есть такая возможность...

4

Re: AHK: Аналог PixelGetColor для перекрытого окна

Там у нескольких участников заработало. Поспрашивайте у них в той теме.

5

Re: AHK: Аналог PixelGetColor для перекрытого окна

Насколько я помню, нет метода который работает во всех окнах.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

6 (изменено: teadrinker, 2020-06-06 03:47:09)

Re: AHK: Аналог PixelGetColor для перекрытого окна

Через PrintWindow правильно так:

title := "MyWindow" ; указать заголовок окна или класс через ahk_class

X := 300            ; указать координаты в окне
Y := 300

hWnd := WinExist(title)

MsgBox, % PixelRGB := GetPixel(hWnd, X, Y)

GetPixel(hWnd, X, Y) {
   hDC := DllCall("GetDC", "Ptr", hWnd, "Ptr")
   hMDC := DllCall("CreateCompatibleDC", "Ptr", hDC, "Ptr")
   WinGetPos,,, W, H, ahk_id %hWnd%
   hBitmap := DllCall("CreateCompatibleBitmap", "Ptr", hDC, "UInt", W, "UInt", H, "Ptr")
   hObj := DllCall("SelectObject", "Ptr", hMDC, "Ptr", hBitmap, "Ptr")
   DllCall("PrintWindow", "Ptr", hWnd, "Ptr", hMDC, "UInt", 0)
   COLORREF := DllCall("GetPixel", "Ptr", hMDC, "UInt", X, "UInt", Y)
   DllCall("SelectObject", "Ptr", hMDC, "Ptr", hObj, "Ptr")
   DllCall("DeleteDC", "Ptr", hMDC)
   DllCall("DeleteObject", "Ptr", hBitmap)
   DllCall("ReleaseDC", "Ptr", hWnd, "Ptr", hDC)
   Return Format("{:#x}", (COLORREF & 0xFF) << 16 | (COLORREF >> 8 & 0xFF) << 8 | COLORREF >> 16)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

7

Re: AHK: Аналог PixelGetColor для перекрытого окна

serzh82saratov пишет:

Насколько я помню, нет метода который работает во всех окнах.

Я таких окон из которых нельзя еще не встречал.

8

Re: AHK: Аналог PixelGetColor для перекрытого окна

Может я не правильно использовал PrintWindow, вроде как в окнах с применением SetWindowDisplayAffinity на семёрке у меня не работало, пруфы сейчас не приведу.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

9

Re: AHK: Аналог PixelGetColor для перекрытого окна

SetWindowDisplayAffinity можно обойти, либо так:
http://forum.script-coding.com/viewtopic.php?id=15061
либо инжектом.

10

Re: AHK: Аналог PixelGetColor для перекрытого окна

Пропустил эту тему.

Malcev пишет:

либо инжектом.

Не будет работать с hardware-accelerated окнами.

Инжект помогает?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

11

Re: AHK: Аналог PixelGetColor для перекрытого окна

Думаю да, просто нужно вызвать из процесса SetWindowDisplayAffinity с WDA_NONE.

12 (изменено: Malcev, 2020-06-05 00:18:59)

Re: AHK: Аналог PixelGetColor для перекрытого окна

teadrinker пишет:

Через PrintWindow правильно так:

Еще стоит проверять win>=8.1 и в таком случае в PrintWindow отправлять флаг 2.
Тогда можно захватывать окна ускоренные хардверно, типа хрома.
https://github.com/tpn/winddk-8.1/blob/ … er.h#L4408
И вместо GetPixel для скорости лучше использовать Lockbits.

13

Re: AHK: Аналог PixelGetColor для перекрытого окна

Malcev пишет:

Еще стоит проверять win>=8.1 и в таком случае в PrintWindow отправлять флаг 2.

Да, знал про это, да уже забыл, пользоваться в реальности никогда не приходилось.
Lockbits — это если нужно много пикселей просмотреть, иногда достаточно одного.

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

14

Re: AHK: Аналог PixelGetColor для перекрытого окна

serzh82saratov
Приветствую, то есть для моего случая надо сделать так? (На примере Хрома)

title := "ahk_class Chrome_WidgetWin_1" ; указать заголовок окна или класс через ahk_class

X :=  1249 ; указать координаты в окне
Y := 1037

hWnd := WinExist(title)

if (PixelRGB := GetPixel(hWnd, X, Y) = 0x3921E7)
{
SoundBeep, 150, 300
Pause
Goto, Label1
}

GetPixel(hWnd, X, Y) {
   hDC := DllCall("GetDC", "Ptr", hWnd, "Ptr")
   hMDC := DllCall("CreateCompatibleDC", "Ptr", hDC, "Ptr")
   WinGetPos,,, W, H, ahk_id %hWnd%
   hBitmap := DllCall("CreateCompatibleBitmap", "Ptr", hDC, "UInt", W, "UInt", H, "Ptr")
   hObj := DllCall("SelectObject", "Ptr", hMDC, "Ptr", hBitmap, "Ptr")
   DllCall("PrintWindow", "Ptr", hWnd, "Ptr", hMDC, "UInt", 0)
   COLORREF := DllCall("GetPixel", "Ptr", hMDC, "UInt", X, "UInt", Y)
   DllCall("SelectObject", "Ptr", hMDC, "Ptr", hObj, "Ptr")
   DllCall("DeleteDC", "Ptr", hMDC)
   DllCall("DeleteObject", "Ptr", hBitmap)
   DllCall("ReleaseDC", "Ptr", ahk_id %hWnd%, "Ptr", hDC)
   Return Format("{:#x}", (COLORREF & 0xFF) << 16 | (COLORREF >> 8 & 0xFF) << 8 | COLORREF >> 16)
}

А-то я уже как только не пытался играться с подобными кодами, так ничего и не выходило... Нужно просто проверить цвет 1 пикселя и выполнить условие если он будет нужного цвета.

Заранее спасибо!

15

Re: AHK: Аналог PixelGetColor для перекрытого окна

Перечитайте 12 пост.

16

Re: AHK: Аналог PixelGetColor для перекрытого окна

Malcev
Да я просто новичек в этом всем, пытался читать код, который в ссылке к 12 посту и не понял что где

17 (изменено: Malcev, 2020-06-05 17:10:02)

Re: AHK: Аналог PixelGetColor для перекрытого окна

Тут

DllCall("PrintWindow", "Ptr", hWnd, "Ptr", hMDC, "UInt", 0)

надо заменить на

DllCall("PrintWindow", "Ptr", hWnd, "Ptr", hMDC, "UInt", 2)

Если у вас винда старая < 8.1, то данный способ не сработает.
Тогда единственный вариант запускать хром с аргументом --disable-gpu.
Либо пробовать через апи лупы.
Либо хакать dwm.exe.
https://github.com/steeve/dwmaxx2
И еще для хрома хендл определять надо так:

hWnd := WinExist("ahk_class Chrome_WidgetWin_1", "Chrome Legacy Window")

18

Re: AHK: Аналог PixelGetColor для перекрытого окна

Malcev
Благодарю, вроде цвет пикселя получить смог (Windows 10 если что), а как теперь добавить сюда условие? Если пиксель нужного цвета, то запускаем нужный цикл?

19

Re: AHK: Аналог PixelGetColor для перекрытого окна

RTFM!

20

Re: AHK: Аналог PixelGetColor для перекрытого окна

teadrinker, у тебя опечатка:

teadrinker пишет:

DllCall("ReleaseDC", "Ptr", ahk_id %hWnd%, "Ptr", hDC)

21

Re: AHK: Аналог PixelGetColor для перекрытого окна

Универсально и быстрее PrintWindow для десятка пикселей:

; клиентские координаты интересующих пикселей
x1 := 1000, y1 := 10
x2 := 1000, y2 := 20
hWnd := WinExist("A") ; идентификация окна
WinPos := WinGetP(hWnd) ; координаты клиентской области окна
;=====================================================
hDC   := Window_CreateCapture(hWnd) ; снимок окна

pix1 := Client_GetPixel(hDC, x1, y1, WinPos)
pix2 := Client_GetPixel(hDC, x2, y2, WinPos)

Window_DeleteWindowCapture(hWnd, hDC) ; удаление снимка
;=====================================================
MsgBox % Format("{:#0x}", pix1) " " Format("{:#0x}", pix2) ; формат BGR hex
Return

Window_CreateCapture(hwnd) {
	Return DllCall("user32.dll\GetDCEx", "UInt", hwnd, "UInt", 0, "UInt", 1|2)
} ; 1|2|8|16 — флаги ставим по документации GetDCEx на msdn
Client_GetPixel(hDC, x, y, WinPos) {
	Return DllCall("gdi32.dll\GetPixel", "UInt", hDC, "Int", x+WinPos.Client2Win.x, "Int", y+WinPos.Client2Win.y, "UInt")
}
Window_DeleteWindowCapture(hwnd, hDC) {
	Return DllCall("user32.dll\ReleaseDC", "UInt", hwnd, "UInt", hDC)
}
WinGetP(hwnd) {
	WinGetPos, x_W, y_W, w_W, h_W, % "ahk_id " hWnd
	VarSetCapacity(pt, 16)
	NumPut(x, pt, 0) || NumPut(y, pt, 4) || NumPut(w, pt, 8) || NumPut(h, pt, 12)
	if !DllCall("GetClientRect", UInt, hWnd, UInt, &pt)
		Return
	if !DllCall("ClientToScreen", UInt, hWnd, UInt, &pt)
		Return
	x := NumGet(pt, 0, Int), y := NumGet(pt, 4, Int)
	w := NumGet(pt, 8, Int), h := NumGet(pt, 12, Int)
	Client := {x:x, y:y, w:w, h:h}, Client2Win := {x:x-x_W, y:y-y_W, w:w, h:h}
	Return WinP := {x:x_W, y:y_W, w:w_W, h:h_W, Client2Win:Client2Win, Client:Client}
}
Win7x64, AutoHotkey 1.1.30.00

22

Re: AHK: Аналог PixelGetColor для перекрытого окна

stealzy пишет:

Универсально

Не универсально.
С hardware-accelerated окнами потестируйте.
С тем же хромом или WMP.

23

Re: AHK: Аналог PixelGetColor для перекрытого окна

Malcev пишет:

teadrinker, у тебя опечатка

Поправил.

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

24

Re: AHK: Аналог PixelGetColor для перекрытого окна

Упустил момент, только насчет версий ОС заметил.

Win7x64, AutoHotkey 1.1.30.00

25

Re: AHK: Аналог PixelGetColor для перекрытого окна

teadrinker
Я может быть тупой, но как получить несколько разных пикселей?

if (GetPixel(hWnd, X, Y) = 0xFF0000 или 0xFF0055 или 0xFF1055)
{
Goto, label1
}

26

Re: AHK: Аналог PixelGetColor для перекрытого окна

;X := 0xFF0000
;X := 0xFF0055
X := 0xFF1055

IF (X = 0xFF0000) OR (X = 0xFF0055) OR (X = 0xFF1055)
MsgBox, X равен одному из перечисленных значений

27

Re: AHK: Аналог PixelGetColor для перекрытого окна

Wraith пишет:

как получить несколько разных пикселей?

Получить несколько разных пикселей, или сравнить одно полученное значение с несколькими?

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

28

Re: AHK: Аналог PixelGetColor для перекрытого окна

teadrinker
В одном пикселе получить несколько разных цветов

29

Re: AHK: Аналог PixelGetColor для перекрытого окна

Не очень понял. В пикселе вы ничего не можете получить, можно получить только цвет пикселя, одного или нескольких.

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

30

Re: AHK: Аналог PixelGetColor для перекрытого окна

Получить составляющие R, G, B по отдельности что ли?

31 (изменено: Wraith, 2020-06-07 12:50:44)

Re: AHK: Аналог PixelGetColor для перекрытого окна

teadrinker пишет:

Не очень понял. В пикселе вы ничего не можете получить, можно получить только цвет пикселя, одного или нескольких.

У меня так же не получается сделать

PixelGetColor, color, 100, 100
if (color = 0xFF0000) | (color = 0xFF0055) | (color = 0xFF1055)
{
Goto,
}

32

Re: AHK: Аналог PixelGetColor для перекрытого окна

Нужно использовать ||.

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

33

Re: AHK: Аналог PixelGetColor для перекрытого окна

teadrinker пишет:

Нужно использовать ||.

У меня не получается именно с GetPixel сделать также, я перепробовал, все что получалось с pixelgetcolor

И все таки, как это сделать?)

if (GetPixel(hWnd, X, Y) = 0xFF0000 или 0xFF0055 или 0xFF1055)
{
Goto, label1
}

34

Re: AHK: Аналог PixelGetColor для перекрытого окна

Сначала сохраните то, что возвращает GetPixel(), в переменную, потом переменную сравнивайте.

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