Zireael |
Отправлено: 15 Октября, 2020 - 01:45:46
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Вы уверены, что поиск изображений в фоновом режиме применим к LDPlayer?
Да. Т. к. содержимое окна отображается во вкладке графика.
Цитата: Подскажи пример хотя бы.
CODE:int Image_0[87][29];
loadimage (#Image_0[0][0], "D:\Kibor2\Image_0.bmp");
int PosX, PosY;
win w = window ("LDPlayer", "LDPlayerMainFrame", -1);
if(w)
{
if(findimage(1, #Image_0[0][0], 0, #PosX, #PosY, 0, 0, 1920, 1080, w))
{
messagebox("Картинка найдена в координатах:^r^nX = "+format(PosX)+"^r^nY = "+format(PosY));
mousemove(PosX, PosY, w);
}
else messagebox("Картинка найдена");
}
else messagebox("Окно не найдено"); |
|
|
dulger |
Отправлено: 16 Октября, 2020 - 00:05:33
|
Участник
Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2017
Репутация: 0
|
Zireael пишет: Цитата: Вы уверены, что поиск изображений в фоновом режиме применим к LDPlayer?
Да. Т. к. содержимое окна отображается во вкладке графика.
Цитата: Подскажи пример хотя бы.
CODE:int Image_0[87][29];
loadimage (#Image_0[0][0], "D:\Kibor2\Image_0.bmp");
int PosX, PosY;
win w = window ("LDPlayer", "LDPlayerMainFrame", -1);
if(w)
{
if(findimage(1, #Image_0[0][0], 0, #PosX, #PosY, 0, 0, 1920, 1080, w))
{
messagebox("Картинка найдена в координатах:^r^nX = "+format(PosX)+"^r^nY = "+format(PosY));
mousemove(PosX, PosY, w);
}
else messagebox("Картинка найдена");
}
else messagebox("Окно не найдено");
Странно... Попробовал сегодня ваш пример и у меня не находит картинку. Пробовал тестить на win 10. |
|
|
dulger |
Отправлено: 16 Октября, 2020 - 07:54:02
|
Участник
Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2017
Репутация: 0
|
Zireael пишет: Цитата: не находит картинку
Во вкладке графика отображается изображение с эмулятора?
Нет конечно. LDPlayer работает на OpenGL. Поэтому я и спрашивал уверенны ли вы, что данный пример применим к LDPlayer. Я не понимаю, почему данную проблему до сих пор ещё не решили ибо боты на андроид сейчас очень актуальны. Использовать голимый NOX, который не работает с большинством играми в режиме Directx, вообще не вариант.(Отредактировано автором: 16 Октября, 2020 - 07:59:31) |
|
|
dulger |
Отправлено: 16 Октября, 2020 - 12:46:50
|
Участник
Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2017
Репутация: 0
|
Zireael пишет: Цитата: LDPlayer работает на OpenGL.
И что?
Настройки стандартные, ничего не менял.
Это вы сканируете весь рабочий стол естественно изображение LDPlayera присутствует.
Но когда вы пытаетесь искать:
win w = window ("LDPlayer", "LDPlayerMainFrame", -1);
То вы уже ищете в окне самого LDPlayera а там уже совсем другая картина. вы видите окно запуска LDPlayera но не то что вам нужно. А задача стоит в том, что бы поиск картинок работал в перекрытых окнах LDPlayera. Поставьте галочку Окно и сами всё увидите. Я бьюсь с этим уже месяц и не могу найти решения, которое бы работало
(Добавление)
Вот использовал ваш код для проверки:
CODE:#define SRCCOPY 13369376
#define WS_EX_TRANSPARENT 32
#define WS_EX_LAYERED 524288
#define GWL_EXSTYLE -20
#define GWL_STYLE -16
#define LWA_COLORKEY 1
#define COLOR_3DFACE 15
#define FALSE 0
#define UnitPixel 2
external(INT, "GdiplusStartup", "GdiplusStartup", "Gdiplus.dll");
external(INT, "GdiplusShutdown", "GdiplusShutdown", "Gdiplus.dll");
external(INT, "GdipDisposeImage", "GdipDisposeImage", "Gdiplus.dll");
external(INT, "GdipCreateFromHWND", "GdipCreateFromHWND", "Gdiplus.dll");
external(INT, "GdipDeleteGraphics", "GdipDeleteGraphics", "Gdiplus.dll");
external(INT, "GdipCreateBitmapFromHBITMAP", "GdipCreateBitmapFromHBITMAP", "Gdiplus.dll");
external(INT, "GdipDrawImageRectRectI", "GdipDrawImageRectRectI", "Gdiplus.dll");
external(INT, "GetDC", "GetDC", "User32.dll");
external(INT, "ReleaseDC", "ReleaseDC", "User32.dll");
external(INT, "DeleteDC", "DeleteDC", "Gdi32.dll");
external(INT, "SelectObject", "SelectObject", "Gdi32.dll");
external(INT, "DeleteObject", "DeleteObject", "Gdi32.dll");
external(INT, "CreateCompatibleDC", "CreateCompatibleDC", "Gdi32.dll");
external(INT, "CreateCompatibleBitmap", "CreateCompatibleBitmap", "Gdi32.dll");
external(INT, "BitBlt", "BitBlt", "Gdi32.dll");
external(INT, "SetLayeredWindowAttributes", "SetLayeredWindowAttributes", "User32.dll" );
external(INT, "SetWindowLong", "SetWindowLongA", "User32.dll" );
external(INT, "GetSysColor", "GetSysColor", "User32.dll");
external(INT, "MoveWindow", "MoveWindow", "User32.dll");
win w=window ("LDPlayer", "LDPlayerMainFrame", -1); // окно, с которого выводить изображение
if(w==0)
{
messagebox("Окно не найдено");
}
else
{
int gdiplusToken;
char gdiplusStartupInput[16];
initialarray(#gdiplusStartupInput[0], 0);
writeaddress(1, address(#gdiplusStartupInput[0]));
GdiplusStartup(address(#gdiplusToken), address(#gdiplusStartupInput[0]), 0);
createdialog(0);
showdialog(0, "Dialog", 0, 0, 0, 0, 1, 1);
int coord[4]={0, 0, 1000, 700}; // координаты
int percent = 50; // процент вывода
visualwindow(0, coord[0], coord[1], coord[2], coord[3], 650, 400, percent, w);
looptime(5000)
{
// 0-3 рамка захвата, 4-5 позиция вывода, 6 процент вывода, окно
visualwindow2(coord[0], coord[1], coord[2], coord[3], 50, 400, percent, w);
sleep(1);
}
GdiplusShutdown(gdiplusToken);
}
function getmessage(0, WM_CREATE)
{
SetWindowLong(gethwnd(0), GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_TRANSPARENT);
SetWindowLong(gethwnd(0), GWL_STYLE, 0);
SetLayeredWindowAttributes(gethwnd(0), GetSysColor(COLOR_3DFACE), 0, LWA_COLORKEY);
}
function visualwindow2(int sx, int sy, int ex, int ey, int posX, int posY, int percent, win window_)
{
int width = ex-sx;
int height = ey-sy;
// получить скрин окна
int hScreen = GetDC(formatwi(window_));
int hDc = CreateCompatibleDC(hScreen);
int hBitmap = CreateCompatibleBitmap(hScreen, width, height);
int old_obj = SelectObject(hDc, hBitmap);
BitBlt(hDc, 0, 0, width, height, hScreen, sx, sy, SRCCOPY);
// изменить размер диалога
int w = width*percent/100;
int h = height*percent/100;
MoveWindow(gethwnd(0), posX, posY, w, h, FALSE);
// вывод на диалог
int bitmap;
int lnGraphics;
GdipCreateFromHWND(gethwnd(0), address(#lnGraphics));
GdipCreateBitmapFromHBITMAP(hBitmap, 0, address(#bitmap));
GdipDrawImageRectRectI(lnGraphics, bitmap, 0, 0, w, h, 0, 0, width, height, UnitPixel, 0, 0, 0);
GdipDisposeImage(bitmap);
// удаление ресурсов
SelectObject(hDc, old_obj);
DeleteObject(hBitmap);
DeleteDC(hDc);
ReleaseDC(formatwi(window_), hScreen);
GdipDeleteGraphics(lnGraphics);
}
Вы сами можете увидеть, что выводится на изображении. |
|
|
Zireael |
Отправлено: 16 Октября, 2020 - 13:45:44
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
https://drive.google.com/file/d/...view?usp=sharing
В архиве видео. LDPlayer на втором рабочем столе, перейдя на первый рабочий стол запускаем скрипт, visualwindow выводит изображение с эмулятора. Естественно и findimage будет работать.
Цитата: Поставьте галочку Окно
Зачем? Если нужно получить изображение с окна в фоне, то галка должна быть контрол.
Цитата: Вы сами можете увидеть, что выводится на изображении.
Выводится изображение с эмулятора, при том что он на другом рабочем столе. |
|
|
dulger |
Отправлено: 16 Октября, 2020 - 13:58:45
|
Участник
Покинул форум
Сообщений всего: 70
Дата рег-ции: Февр. 2017
Репутация: 0
|
Zireael пишет: https://drive.google.com/file/d/...view?usp=sharing
В архиве видео. LDPlayer на втором рабочем столе, перейдя на первый рабочий стол запускаем скрипт, visualwindow выводит изображение с эмулятора. Естественно и findimage будет работать.
Цитата: Поставьте галочку Окно
Зачем? Если нужно получить изображение с окна в фоне, то галка должна быть контрол.
Цитата: Вы сами можете увидеть, что выводится на изображении.
Выводится изображение с эмулятора, при том что он на другом рабочем столе.
Странно, у меня совсем другая картина. Вот видео: Видео
Может быть у меня что не так с виндой? Странно, очень странно. Аж руки опускаются |
|
|
|