|
Поиск цвета в перекрытом окне |
|
|
cirus |
13.11.2020, 3:48
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26745
Пользователь №: 16.971
Возраст: 29
|
Скрин нормально сделает с окна? Скрин окна
Код --lua local ffi = require("ffi") local shell = ffi.load('Shell32.dll') local C = ffi.C local GA_ROOTOWNER = 3 local SW_SHOW = 5 ffi.cdef[[ int GetAncestor(int hwnd, unsigned int gaFlags); typedef struct { long left; long top; long right; long bottom;} RECT; typedef struct { int cbSize; RECT rcWindow; RECT rcClient; int dwStyle; int dwExStyle; int dwWindowStatus; int cxWindowBorders; int cyWindowBorders; short atomWindowType; short wCreatorVersion;} WINDOWINFO; bool GetWindowInfo(int hwnd, WINDOWINFO* pwi); int ShellExecuteA(int hwnd, const char* lpOperation, const char* lpFile, const char* lpParameters, const char* lpDirectory, int nShowCmd); ]] local wi = ffi.new('WINDOWINFO') C.GetWindowInfo(C.GetAncestor(workwindow(), GA_ROOTOWNER), wi) local pos_client_x = wi.rcClient.left - wi.rcWindow.left local pos_client_y = wi.rcClient.top - wi.rcWindow.top local width_client = wi.rcClient.right - wi.rcClient.left local height_client = wi.rcClient.bottom - wi.rcClient.top
-- привязка к окну Ctrl+A local path_to_screen = [[C:\window.bmp]] -- путь для скрина printscreen (C.GetAncestor(workwindow(), GA_ROOTOWNER), pos_client_x, pos_client_y, width_client, height_client, path_to_screen) shell.ShellExecuteA(0, 'open', path_to_screen, '', '', SW_SHOW)
|
|
|
|
MixidFinder |
13.11.2020, 15:55
|
Registred
Сообщений: 9
Регистрация: 15.9.2013 Группа: Пользователи Наличность: 0
Пользователь №: 16.321
Возраст: 23
|
Цитата(cirus @ 13.11.2020, 3:48) Скрин нормально сделает с окна?
Да, все норм, даже если чем то перекрыть, тоже все отлично Цитата(DarkMaster @ 13.11.2020, 7:05) А код ваш можно увидеть? Методом поиска должен быть указан хэндл. Обычно оно или работает всегда или не работает никогда(для конкретного приложения) =)
Код собственно простейший Код left 447, 911 5 5 if color (272, 456) = 4406046 left 273, 453 5 5 end_if Привязываю в ручную к окну через хоткей Сообщение отредактировал DarkMaster - 13.11.2020, 17:16
|
|
|
|
MixidFinder |
13.11.2020, 17:36
|
Registred
Сообщений: 9
Регистрация: 15.9.2013 Группа: Пользователи Наличность: 0
Пользователь №: 16.321
Возраст: 23
|
Цитата(DarkMaster @ 13.11.2020, 17:16) Когда вы хотите дергать с перекрытого окна, то вам нужно в явном виде указать хэндл. Чтобы выдернуть хэндл текущего рабочего окна можно использовать workwindow Код left 447, 911 5 5 if color (272, 456, workwindow) = 4406046 left 273, 453 5 5 end_if
Интересно, но почему то при таком раскладе он перестает находить цвет в пикселе вообще. Если смотреть в кнопке F, то там просто черный прямоугольник А если привязывать хоткеем к окну, то почему то показывает только часть окна
|
|
|
|
MixidFinder |
13.11.2020, 22:47
|
Registred
Сообщений: 9
Регистрация: 15.9.2013 Группа: Пользователи Наличность: 0
Пользователь №: 16.321
Возраст: 23
|
Цитата(DarkMaster @ 13.11.2020, 20:47) Извиняюсь, запамятовал. Там был какой-то косяк с color. Во времена изменения findcolor поиск через color по хендлу то ли бы поломан, то ли не дофикшен вместе в финдколором. Используйте findcolor (возможно будет необходимо задать точку чуть шире, чем один пиксель).
В общем та же ситуация, только теперь в кнопке F видно нормальное обновление картинки по координатам поиска, но все так же если перекрыть окно, в F будет показываться окно, которым перекрываю. Насколько я понял это проблема с Win10 и решается она возможно установкой Aero Glass, но на 2004 обновление винды эта прога не ставится. Так что не знаю, есть ли еще какое решение)
|
|
|
|
cirus |
14.11.2020, 1:55
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26745
Пользователь №: 16.971
Возраст: 29
|
Получить цвет с перекрытого окна
Код --lua local ffi = require("ffi") local C = ffi.C ffi.cdef[[ int GetDC(int hWnd); int ReleaseDC(int hWnd, int hDC); unsigned long GetPixel(int hdc, int x, int y); ]] function getcolor(x, y, handle) local HDC = C.GetDC (handle or 0) local color=C.GetPixel(HDC, x, y) C.ReleaseDC(handle or 0, HDC) return color end
-- ваш код local handle = workwindow()
if getcolor(70, 153, handle) == 3866470 then -- если в координатах 70 153 цвет 3866470 log ('Цвет нужный') left (70, 153, 5, 5) -- клик end
if getcolor(36, 494, handle) == 1513444 then log ('+++') end
log(getcolor(36, 494, handle))
|
|
|
|
MixidFinder |
14.11.2020, 11:32
|
Registred
Сообщений: 9
Регистрация: 15.9.2013 Группа: Пользователи Наличность: 0
Пользователь №: 16.321
Возраст: 23
|
Цитата(DarkMaster @ 14.11.2020, 7:27) указывайте хэндл в методе поиска
left 447, 911 5 5 set #en findcolor (212, 451, 329, 486, 1 1 (5918762) 198706) if #en > 0 left 250, 468 5 5 end_if Вот такой код с привязкой все равно видит окно, которым перекрываю, а не рабочее окно, workwindow тоже пробовал, тот же результат Цитата(cirus @ 14.11.2020, 1:55) Получить цвет с перекрытого окна
Код --lua local ffi = require("ffi") local C = ffi.C ffi.cdef[[ int GetDC(int hWnd); int ReleaseDC(int hWnd, int hDC); unsigned long GetPixel(int hdc, int x, int y); ]] function getcolor(x, y, handle) local HDC = C.GetDC (handle or 0) local color=C.GetPixel(HDC, x, y) C.ReleaseDC(handle or 0, HDC) return color end -- ваш код local handle = workwindow()
if getcolor(70, 153, handle) == 3866470 then -- если в координатах 70 153 цвет 3866470 log ('Цвет нужный') left (70, 153, 5, 5) -- клик end
if getcolor(36, 494, handle) == 1513444 then log ('+++') end
log(getcolor(36, 494, handle)) В луа вообще не шарю если честно, поменял в вашем коде координаты на свои, единственное что происходит, это выводится какое то число в лог и больше ничего не происходит. Сорри что туплю, но только недавно перешел на пилот
|
|
|
|
MixidFinder |
14.11.2020, 12:40
|
Registred
Сообщений: 9
Регистрация: 15.9.2013 Группа: Пользователи Наличность: 0
Пользователь №: 16.321
Возраст: 23
|
Цитата(DarkMaster @ 14.11.2020, 12:00) Массив где? Код // Пример 3 set #c findcolor ( 339 501 341 631 1 1 (207) %close workwindow ) // поиск в рабочем окне (даже в перекрытом)
С массивом привязка к рабочему окну выдает только черный цвет, но если привязать к родительскому окну, то вроде как цвет находит, правда и все координаты смещаются, собственно и возникает вопрос, как все эти координаты подправлять, не каждый же раз выверять все это? И может вопрос глупый, но как искать координаты мыши без привязки к окну?) на вкладке общее вижу сочетание клавиш ctr+A, но в скриптах оно не работает, просто выделяет весь код. А если смотреть координаты с привязкой, то не смогу узнать нормально координаты дочернего окна
|
|
|
|
MixidFinder |
14.11.2020, 14:27
|
Registred
Сообщений: 9
Регистрация: 15.9.2013 Группа: Пользователи Наличность: 0
Пользователь №: 16.321
Возраст: 23
|
Цитата(DarkMaster @ 14.11.2020, 14:15) В целом зачастую можно сделать привязку к родительскому и кликать в родительское, но работает не всегда.
Особо никак. Рекомендую просто завести переменную в которой будет содержаться смещение и везде прогонять. В рамка луа проще - там можно свою функцию кликов впилить. Можете вприципе через call сделать свою функцию, которая оффсеты будет считать. Но я скорее всего бы не парился и просто делал пару set'ов или через eval подставлял.
А можно пример, если не сложно?
|
|
|
|
MixidFinder |
14.11.2020, 15:10
|
Registred
Сообщений: 9
Регистрация: 15.9.2013 Группа: Пользователи Наличность: 0
Пользователь №: 16.321
Возраст: 23
|
Цитата(DarkMaster @ 14.11.2020, 15:02) Код в шапку set #offset_x 10 set #offset_y 10
где-то далеко в коде set #a findcolor... %arr ... set x = %arr[1 1] + #offset_x set y = %arr[1 2] + #offset_y left x y
либо set #a findcolor... %arr ... left eval(%arr[1 1] + #offset_x) eval(%arr[1 2] + #offset_y) call не пользовался особо) Спасибо большое) и последний вопрос, можно как то координаты мыши смотреть не используя хоткей привязки к окну?
|
|
|
|
umba |
4.1.2021, 12:03
|
Registred
Сообщений: 2
Регистрация: 4.1.2021 Группа: Пользователи Наличность: 0
Пользователь №: 19.846
Возраст: 39
|
Здравствуйте. Имею похожую ситуацию, как у автора. Код set #d findcolor (0, 0 1000, 1000 1 1 (7431259 ) %arr 2) прекрасно отрабатывает, кнопка "F" показывает содержимое окна, в котором идет поиск. Меняю на Код set #d findcolor (0, 0 1000, 1000 1 1 (7431259 ) %arr workwindow) ничего не ищется, по кнопке "F" черный экран. По сути, автоматизирую фарм в мобильной игре, которая исполняется в NOX Player. Возможно есть какая-то проблема самого NOX-а. По рекомендации wiki поставил InqSoft Window Scanner, перебрал все окна NOX, которые он находит, для каждого из них результат разнится (где-то черный экран, где-то белый, где-то какая-то реклама) но всё равно остаётся не успешным. Аеро тема windows включена. Помогите пожалуйста разобраться, как мне правильно подцепить пилота к окну. Полный текст моего незамысловатого скрипта: Код //set #handleWin findwindow (umbabarauma) //set workwindow #handleWin //set #hdl 132234 //set workwindow #hdl
// PICTURES set $path "C:\Users\Eduard\Desktop\UoPilot\pic\" set %picture[1] gas // galaxy pirate attack screen set %picture[2] event_npc_marker // event npc makrer set %picture[3] error_relocate // error marker for npc click set %picture[4] anti_bot // error marker for anti_bot window //set %picture[5] search_screen // search screen of the radar set %picture[5] search_screen1 // search screen of the radar
set #d findcolor (0, 0 1000, 1000 1 1 (7431259 ) %arr 2) if #d > 0 // Если нашли set logging timenow free fleet is available left %arr [1 1], %arr[1 2] // Клик по месту где нашел свободный флот wait 500 + random (50)
end_if log workwindow -------------- #d
//set #a findimage (0, 0 1370, 960 ($path%picture[5].bmp) %crds workwindow 80 1 3) //if #a > 0 // set logging timenow search menu found, proceeding //else // set logging timenow search menu not found, raising ERROR FLAG // return //find_galaxy_pirate_on_radar //end_if //log workwindow -------------- #a
end_script
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|