Almighty |
Отправлено: 05 Октября, 2020 - 22:16:55
|
Участник
Покинул форум
Сообщений всего: 64
Дата рег-ции: Июнь 2018
Откуда: Kyiv
Репутация: 2
|
Доброго времени суток.
Использую для игры эмулятор Нокс.
Иногда окно само меняет свое расположение на экране и сдвигается за пределы монитора.
Подскажите, как правильно выполнить проверку расположения окна и вернуть его на исходное место. Задавать изначально координаты нету смысла, так как использую часто по 2 эмулятора.
Код, который использую для получения координат на окно, а так же размеры окна прилагается. Благодарю
CODE:options ( "pause" , 160, 110);
//int ttX, ttY;
getmouse(ttX, ttY);
win wO=getwindow(0, ttX, ttY);
//messagebox (wO.name);
if (wO.widthclient!=789 || wO.heightclient!=475)
{
wO.widthclient=789;
wO.heightclient=475;
moveclient(wO);
pause(2000);
ex_KIB=w_KIB.widthclient; ey_KIB=w_KIB.heightclient;
} |
|
|
Zireael |
Отправлено: 06 Октября, 2020 - 02:01:15
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: как правильно выполнить проверку расположения окна и вернуть его на исходное место.
CODE:win w = window (-1, "Notepad", -1); // окно (блокнот в данном случае)
if(w) // если окно найдено
{
if(w.top!=0 || w.left!=0) // если окно находится не в координатах 0 0
{
w.top=0;
w.left=0;
movewindow(w); // переместить окно в координаты 0 0
}
}
else messagebox("Окно не найдено"); |
|
|
Almighty |
Отправлено: 06 Октября, 2020 - 13:22:20
|
Участник
Покинул форум
Сообщений всего: 64
Дата рег-ции: Июнь 2018
Откуда: Kyiv
Репутация: 2
|
Zireael пишет: Цитата: как правильно выполнить проверку расположения окна и вернуть его на исходное место.
CODE:win w = window (-1, "Notepad", -1); // окно (блокнот в данном случае)
if(w) // если окно найдено
{
if(w.top!=0 || w.left!=0) // если окно находится не в координатах 0 0
{
w.top=0;
w.left=0;
movewindow(w); // переместить окно в координаты 0 0
}
}
else messagebox("Окно не найдено");
Подскажите, как задать не изначально координаты в коде, а получить их (координаты окна) в момент запуска окна, а если окно переместилось - вернуть обратно на изначальный координаты.
Вижу в коде, который вы предложили изначально задаются координаты, если будет 2 эмулятора - два окна на ложатся друг на друга |
|
|
Zireael |
Отправлено: 06 Октября, 2020 - 13:34:21
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: как задать не изначально координаты в коде, а получить их (координаты окна)
CODE:int startPosX, startPosY;
win w = window (-1, "Notepad", -1); // окно (блокнот в данном случае)
if(w) // если окно найдено
{
startPosX = w.left; // запомнить положение окна
startPosY = w.top;
enabletimer(0);
loop()
{
// нужные действия
sleep(10);
}
}
else messagebox("Окно не найдено");
CREATE_TIMER(0, 500)
{
setwindowparam(w); // обновить параметры окна
if(w.top!=startPosY || w.left!=startPosX) // если позиция изменилась
{
w.left=startPosX;
w.top=startPosY;
movewindow(w); // переместить окно
}
} (Отредактировано автором: 06 Октября, 2020 - 13:35:05) |
|
|
Arimor |
Отправлено: 07 Октября, 2020 - 00:44:47
|
Мастер
Покинул форум
Сообщений всего: 125
Дата рег-ции: Сент. 2020
Репутация: 1
|
Almighty пишет: Подскажите, как задать не изначально координаты в коде, а получить их
Хотел решить ваш вопрос в итоге почему то не работает.
Zireael , Подскажите пожалуйста почему мой код не работает?
CODE:int count=6;
win w[count];
int PosX[count], PosY[count];
int x, y;
int P[count];
for(int i=0; i<count; i++)
{
textbkcolor(65280, 0);
textout(i, 100, 100+i*20, P[i], 1);
while(getkeystate(81)==0)sleep(10); // нажать Q
getmouse(x, y);
w[i]=getwindow(0, x, y);
PosX[i] = w[i].left;
PosY[i] = w[i].top;
messagebox(PosX[i]);
}
|
|
|
Zireael |
Отправлено: 07 Октября, 2020 - 02:37:47
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Подскажите пожалуйста почему мой код не работает?
Цитата: int P[count];
Так нельзя нельзя объявлять массивы. Либо используйте статический массив, указывая его размер числом, а не переменной, либо динамический используя оператор new.
CODE:int count=6;
win w[6]; // массив win не может быть динамическим
new int PosX[count];
new int PosY[count];
int x, y;
new int P[count];
for(int i=0; i<count; i++)
{
while(getkeystate(81)==0)sleep(10); // нажать Q
while(getkeystate(81))sleep(10);
getmouse(x, y);
w[i]=getwindow(0, x, y);
PosX[i] = w.left[i];
PosY[i] = w.top[i];
textbkcolor(65280, 0);
textout(i, 100, 100+i*20, format(PosX[i])+" "+format(PosY[i]), 1);
} |
|
|
Zireael |
Отправлено: 08 Октября, 2020 - 02:01:27
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: а вообще возможно для win w[]; задать переменную?
Нет, указывайте числом. Если не известно сколько будет окон, то можно указать больше чем нужно.
Цитата: Есть другой способ переместить окна? EasyAntiCheat блокирует перемещение этим способом
Если не срабатывает movewindow, то и это скорее всего не сработает:
CODE:#define SWP_NOSIZE 0x0001
#define SWP_NOZORDER 0x0004
external(INT, "SetWindowPos", "SetWindowPos", "User32.dll");
win w = window (-1, "Notepad", -1); // окно (блокнот в данном случае)
if(w)
{
// переместить окно в координаты 200 100
SetWindowPos(formatwi(w), 0, 200, 100, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
else messagebox("Окно не найдено");
Можно зажать левую кнопку мыши и перетащить окно. |
|
|
|