Zireael |
Отправлено: 03 Сентября, 2018 - 11:30:48
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: замкнутый цикл на поиске окна по классу данного окна
В системе может быть несколько окон с одинаковым классом.
Искать окно можно ещё по имени, позиции и размеру.
Цитата: window("название окна", "класс окна", лев_верх_X, лев_верх_Y, шир, выс, win wind) индифицирует по имени, класу, позиции относительно верхнего контрола, размеру и указателю на верхний контрол. Если вместо указателя на верхний контрол поставить -1, позиция считается относительно левого верхнего угла экрана. |
|
|
Cocacaca |
Отправлено: 09 Октября, 2018 - 11:46:20
|
Прохожий
Покинул форум
Сообщений всего: 20
Дата рег-ции: Нояб. 2017
Репутация: 0
|
Немного поясню конкретнее.
Есть эмулятор Nox и иконка игры.
Задача: запустить нокс и найти иконку игры.
Происходит следубщее:
Если заранее протестировать указав на неактивное окно (передав переменную окна), картинка ищется моментально. Если же запустить start(Nox) Nox - строка с путем, то после старта Nox, даже если делать активным окно Nox через activate(), картинка отказывается находиться
CODE:
win wind = (-1, "Qt5QWindowIcon", -1);
string nox = "Path";
win w_KIB;
int ex_KIB, ey_KIB, sum_KIB, x_KIB, y_KIB;
int Image_0_KIB[500][500];
start_();
start(nox);
sleep(15000);
m_KIB2:
if (wind.width>-1 && wind.height>-1) goto m_KIB4;
else goto m_KIB3;
m_KIB4: if (findimage_(#Image_0_KIB[0][0], 7000, 0, 0, 1, 0, 0, -1, 0, 0, 0, -1, -1, -1, 0, 100, 1, 0, 0, ex_KIB, ey_KIB, #sum_KIB, #x_KIB, #y_KIB)>0) goto m_KIB5;
else goto m_KIB2;
m_KIB3: sleep(2000);
goto m_KIB2;
m_KIB5:
function start_()
{
load_image_();
pause(1000);
w_KIB=window ("QWidgetClassWindow", "Qt5QWindowIcon", wind);
ex_KIB=w_KIB.widthclient; ey_KIB=w_KIB.heightclient;
}
function findimage_(int #Image, int t, int p1, int p2, int m, int xm, int ym, int mov_m, int mov_x, int mov_y, int p3, int wait, int cycle, int fon, int r, int p, int k, int xs, int ys, int xf, int yf, int#sum, int#x, int#y)
{
int timKIB, sumKIB, xKIB, yKIB, tx, ty, tcycle=0;
sty: pause(p1);
sumKIB=0;
if (t!=0) timKIB=gettime();
a: if (r==0 && p==100){sum=findimage(k, #Image[0][0], fon, #x[0], #y[0], xs, ys, xf, yf, w_KIB); if (sum>0) goto e;}
else {sum=findimage(k, #Image[0][0], fon, #x[0], #y[0], xs, ys, xf, yf, r, r, r, r, r, r, p, 1, w_KIB); if (sum>0) goto e;}
if (t==0) return 0;
if (gettime()-timKIB<t){sleep(20); goto a;}
return 0;
e: sumKIB=sum; xKIB=x[0]; yKIB=y[0];
pause(p2);
if (m==1){sendmouse(LEFT, xs+xKIB+xm, ys+yKIB+ym, w_KIB); goto hy;}
if (m==2){sendmouse(MIDDLE, xs+xKIB+xm, ys+yKIB+ym, w_KIB); goto hy;}
if (m==3){sendmouse(RIGHT, xs+xKIB+xm, ys+yKIB+ym, w_KIB); goto hy;}
if (m==4){sendmousedown(LEFT, xs+xKIB+xm, ys+yKIB+ym, w_KIB); goto hy;}
if (m==5){sendmousedown(MIDDLE, xs+xKIB+xm, ys+yKIB+ym, w_KIB); goto hy;}
if (m==6){sendmousedown(RIGHT, xs+xKIB+xm, ys+yKIB+ym, w_KIB); goto hy;}
if (m==7){sendmouseup(LEFT, xs+xKIB+xm, ys+yKIB+ym, w_KIB); goto hy;}
if (m==8){sendmouseup(MIDDLE, xs+xKIB+xm, ys+yKIB+ym, w_KIB); goto hy;}
if (m==9){sendmouseup(RIGHT, xs+xKIB+xm, ys+yKIB+ym, w_KIB); goto hy;}
if (m==10){sendmousedbl(LEFT, xs+xKIB+xm, ys+yKIB+ym, w_KIB); goto hy;}
if (m==11){sendmousedbl(MIDDLE, xs+xKIB+xm, ys+yKIB+ym, w_KIB); goto hy;}
if (m==12){sendmousedbl(RIGHT, xs+xKIB+xm, ys+yKIB+ym, w_KIB); goto hy;}
if (m==13)sendmousemove(xs+xKIB+xm, ys+yKIB+ym, w_KIB);
hy: if (mov_m==1)sendmousemove(mov_x, mov_y, w_KIB);
if (m>0 && m<14)pause(p3);
if (wait!=-1)
{
for (int ttim=gettime(); gettime()-ttim<wait; sleep(20))
{
if (r==0 && p==100){if (findimage(1, #Image[0][0], fon, #x[0], #y[0], xs, ys, xf, yf, w_KIB)==0)return sumKIB;}
else {if (findimage(1, #Image[0][0], fon, #x[0], #y[0], xs, ys, xf, yf, r, r, r, r, r, r, p, 1, w_KIB)==0)return sumKIB;}
}
if (tcycle<cycle){tcycle++; goto sty;}
return 0;
}
return sumKIB;
}
function load_image_()
{
loadimage (#Image_0_KIB[0][0], "C:\Image_0.bmp");
}
(Отредактировано автором: 09 Октября, 2018 - 11:47:38) |
|
|
Zireael |
Отправлено: 09 Октября, 2018 - 12:16:38
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: win wind = (-1, "Qt5QWindowIcon", -1);
Неправильно, надо window(-1, "Qt5QWindowIcon", -1). К тому же не имеет смысла, окно ведь не открыто.
Сначала вызыватся start_(), в котором w_KIB=window ("QWidgetClassWindow", "Qt5QWindowIcon", wind). Потом запускается nox.
Т. е. ищется указатель, а потом открывается приложение. Надо наоборот, сначала запустить nox, а потом получать указатель. |
|
|
Cocacaca |
Отправлено: 09 Октября, 2018 - 12:23:18
|
Прохожий
Покинул форум
Сообщений всего: 20
Дата рег-ции: Нояб. 2017
Репутация: 0
|
Понял в чем загвоздка...
Контрол к которому наши send`ы все привязаны, сбрасывается, надо его реанимировать и проблема решена.
Всем спасибо за внимание и участие
(Добавление)
Zireael пишет: Цитата: win wind = (-1, "Qt5QWindowIcon", -1);
Неправильно, надо window(-1, "Qt5QWindowIcon", -1). К тому же не имеет смысла, окно ведь не открыто.
Сначала вызыватся start_(), в котором w_KIB=window ("QWidgetClassWindow", "Qt5QWindowIcon", wind). Потом запускается nox.
Т. е. ищется указатель, а потом открывается приложение. Надо наоборот, сначала запустить nox, а потом получать указатель.
Спасибо за ответ, это беглый пример, там все переменные забиты изначально до запуска этих строк кода, поэтому wind у меня уже полностью расписан как положено.
Просто при перезапуске, вдруг закрылся нокс, у нас w_KIB сдыхает и ему надо заново указатель на окно сделать.(Отредактировано автором: 09 Октября, 2018 - 12:26:02) |
|
|
Zireael |
Отправлено: 31 Января, 2019 - 02:15:31
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Можно как-то получить указатель на программу не по координатам и не по названию?
Например, запустить ее через start и сразу получить указатель.
Можно получить id процесса или потока, когда окно откроется получить хендл.
Скрипт запускает exe, ждёт когда окно откроется, получает указатель и заполняет структуру win. Использовать если открыто несколько окон с одинаковым именем или классом.
Получение указателя для запускаемого окна. (Отобразить)CODE:external(INT, "CreateProcess", "CreateProcessA", "Kernel32.dll");
external(INT, "GetWindowInfo", "GetWindowInfo", "User32.dll" );
external(INT, "GetWindowText", "GetWindowTextA", "User32.dll");
external(INT, "GetClassName", "GetClassNameA", "User32.dll");
external(INT, "FindWindowEx", "FindWindowExA", "User32.dll" );
external(INT, "GetWindowThreadProcessId", "GetWindowThreadProcessId", "User32.dll");
// Имя и класс окна можно указать частично. Для латиницы регистр игнорируется.
win w; // переменная глобальная, т. к. нельзя заполнить структуру по указателю
string path="C:\Windows\notepad.exe"; // путь к запускаемому exe
string name="Блокнот"; // имя окна, можно не указывать, если указан класс окна
string class="Notepad"; // класс окна, можно не указывать, если указано имя окна
int wait=10000; // сколько времени ожидать загрузки окна (в мсек)
int handle=start_exe(path, #name, #class, wait); // вызов функции, запустит exe и вернёт хендл окна
if(handle>0) // если хендл найден
{
w=formatiw(handle); // преобразовать хендл к win
structure_win(); // заполнить структуру
messagebox("Имя окна: "+w.name+formatic(13)+formatic(10)+"Класс окна: "+w.class);
}
else messagebox("Окно не найдено");
// функция принимает:
// путь к exe
// указатель на переменную имени окна
// указатель на переменную класса окна
// сколько времени ожидать загрузки окна (в мсек)
function start_exe(string path_to_exe, string #name_window, string #class_window, int wait_for_window)
{
int handle_window[9999], c[9999], c1[17], c2[4], pid, i, h, count_handle=0;
string temp, temp2;
char c3[255], c4[255];
for(i=0; i<sizearray(c1); i++)c1[i]=0;
writeaddress(sizearray(c1)*4, address(#c1[0]));
if(CreateProcess(path_to_exe, 0, 0, 0, 0, 32, 0, 0, address(#c1[0]), address(#c2[0])))
{
looptime(wait_for_window)
{
h=FindWindowEx(0, 0, 0, 0); // поиск всех окон
while(h && count_handle<sizearray(handle_window)){handle_window[count_handle]=h; count_handle++; h=FindWindowEx(0, h, 0, 0);}
for(i=0; i<count_handle; i++)
{
GetWindowThreadProcessId(handle_window[i], address(#pid));
if(pid==c2[2])
{
GetWindowText(handle_window[i], address(#c3[0]), sizearray(c3));
GetClassName(handle_window[i], address(#c4[0]), sizearray(c4));
if(name_window!="" || class_window!="") // если не пустые
{
if(regexsearch(1, #temp, format(#c3[0]), name_window, IGNORECASE) && regexsearch(1, #temp2, format(#c4[0]), class_window, IGNORECASE))
{
name_window=format(#c3[0]); class_window=format(#c4[0]); return handle_window[i];
}
}
else {messagebox("Требуется указать имя или класс окна"); name_window="-1"; class_window="-1"; return -1;}
}
}
}
}
return 0;
}
function structure_win()
{
int info[15];
writeaddress(sizearray(info)*4, address(#info[0]));
if(GetWindowInfo(handle, address(#info[0])))
{
w.width=info[3]-info[1]; w.height=info[4]-info[2]; w.left=info[1]; w.top=info[2]; w.widthclient=info[7]-info[5];
w.heightclient=info[8]-info[6]; w.leftclient=info[5]; w.topclient=info[6]; w.name=name; w.class=class;
}
} |
|
|
007wan |
Отправлено: 26 Февраля, 2019 - 16:42:04
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
CODE:if (message.lparam == Button1)
{
win w1 = window (-1, "MozillaWindowClass", -1);
if (w1.name == "Окно")
{
transparency (-1, w1);
}
}
Почему такая схема не работает, а работает только так:
CODE:if (message.lparam == Button1)
{
win w1 = window (-1, "MozillaWindowClass", -1);
transparency (-1, w1);
if (w1.name == "Окно")
{
}
}
(Добавление)
Да, еще CODE:win w1 = window (-1, "MozillaWindowClass", -1);
работает только тогда, когда его вызываешь вне ФУНКЦИЙ и вне условий |
|
|
|