Kostick |
Отправлено: 16 Января, 2022 - 15:19:14
|
Мастер
Покинул форум
Сообщений всего: 184
Дата рег-ции: Авг. 2020
Репутация: 1
|
Пытаюсь сделать бота в БДО, но не получается отправлять команды нажатия и перемещения мыши или нажатия клавиш в окно в фоне, хотя если отправлять в другое окно в фоне, например, в окно блокнота, то все работает.
Например, код нажимает раз в 5 секунд клавишу i. В БДО должно открываться окно инвентаря. Вот как работает в блокноте, и как в БДО:(для просмотра ссылки Вам необходимо авторизоваться) Т.е. в БДО при запуске активируется окно БДО, и нажатия передаются, но когда вручную переходишь на другое окно (на видео я нажал на визуальный редактор), нажатия прекращаются.
Единственное, у окна БДО не контрола в отличии от блокнота, поэтому приходится указывать просто имя окна:
[img](для просмотра ссылки Вам необходимо авторизоваться) /img]
[img](для просмотра ссылки Вам необходимо авторизоваться) /img]
Есть ли еще варианты передачи нажатий клавиш и мыши в окно в фоне?
есть функция "activate(wind);", но она активирует окно полностью, и тогда не получится работать в другом окне. Может у вас есть идеи?
Есть видео от Vladimir Borda Работа "Кибор в скрытом окне игры под Фростом", где он показывает код, который сворачивает окно и выводит его уменьшенную копию сбоку, при этом клики в него отправляются. Я попробовал так же, вот что происходит (работа сопровождается повторяющимися звуками ошибки):(для просмотра ссылки Вам необходимо авторизоваться) Вот код:
CODE:win W_Kib=selectwindow ("Black Desert - 406459");
//win W_Kib=window ("Black Desert - 406459", "BlackDesertWindowClass", -1);
int eX_Kib, eY_Kib;
eX_Kib=W_Kib.widthclient;
eY_Kib=W_Kib.heightclient;
activate(W_Kib);
transparency (0, W_Kib);
visualwindow(0, 0, 0, W_Kib.widthclient, W_Kib.heightclient, 1095, 565, 25, W_Kib);
KIB_1: Key(1, W_Kib, 0, 73, "Клик", 0);
sleep (500);
goto KIB_1;
function Key(int ew, win w, int p1, int c, string k, int p2)
{
pause(p1);
if (ew==0)
{
if (k=="Клик"){key(c); goto hy;}
if (k=="Нажать"){keydown(c); goto hy;}
if (k=="Отпустить"){keyup(c); goto hy;}
}
if (ew==1)
{
if (k=="Клик"){sendkey(c, w); goto hy;}
if (k=="Нажать"){sendkeydown(c, w); goto hy;}
if (k=="Отпустить"){sendkeyup(c, w); goto hy;}
}
hy: pause (p2);
}
Если вместо "selectwindow" использовать просто "window", то окно выводится, но клики так же не передаются:
https://www.youtube.com/watch?v=JX23n80Na-0(Отредактировано автором: 16 Января, 2022 - 15:30:38) |
|
|
Kostick |
Отправлено: 16 Января, 2022 - 18:26:08
|
Мастер
Покинул форум
Сообщений всего: 184
Дата рег-ции: Авг. 2020
Репутация: 1
|
ivantu пишет: Баг наверное, функция нажатий принимает w вместо W_Kib попробуйте так :
CODE:win W_Kib=window ("Chrome Legacy Window", "Chrome_RenderWidgetHostHWND", window ("Работа в фоне через визуальный редактор — Яндекс.Браузер", "YandexBrowser_WidgetWin_1", -1));
win w=W_Kib;
Я так понял, это не баг, а защита так работает, что только в активном окне приходят команды.
Немного не понял, что мне надо вписывать в скобках после первого "window" и после второго? |
|
|
Zireael |
Отправлено: 16 Января, 2022 - 20:12:22
|
Эксперт
Покинул форум
Сообщений всего: 4469
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: то он сам наверное должен подставлять переменные нужные.
Они подставлены как надо
Цитата: Key(1, W_Kib, 0, 73, "Клик", 0);
функция принимает переменную
Цитата: function Key(int ew, win w, int p1, int c, string k, int p2)
т. е. в функции используется w, но по сути это и есть W_Kib. |
|
|
Kostick |
Отправлено: 17 Января, 2022 - 09:33:10
|
Мастер
Покинул форум
Сообщений всего: 184
Дата рег-ции: Авг. 2020
Репутация: 1
|
Kostick пишет:
Вот код:
CODE://win W_Kib=selectwindow ("Black Desert - 406459");
win W_Kib=window ("Black Desert - 406459", "BlackDesertWindowClass", -1);
int eX_Kib, eY_Kib;
eX_Kib=W_Kib.widthclient;
eY_Kib=W_Kib.heightclient;
activate(W_Kib);
transparency (0, W_Kib);
visualwindow(0, 0, 0, W_Kib.widthclient, W_Kib.heightclient, 1095, 565, 25, W_Kib);
KIB_1: Key(1, W_Kib, 0, 73, "Клик", 0);
sleep (500);
goto KIB_1;
function Key(int ew, win w, int p1, int c, string k, int p2)
{
pause(p1);
if (ew==0)
{
if (k=="Клик"){key(c); goto hy;}
if (k=="Нажать"){keydown(c); goto hy;}
if (k=="Отпустить"){keyup(c); goto hy;}
}
if (ew==1)
{
if (k=="Клик"){sendkey(c, w); goto hy;}
if (k=="Нажать"){sendkeydown(c, w); goto hy;}
if (k=="Отпустить"){sendkeyup(c, w); goto hy;}
}
hy: pause (p2);
}
В общем я понял, что все работает, как на видео:(для просмотра ссылки Вам необходимо авторизоваться) Окно сворачивается, нажатия передаются, но это мнимое сворачивание, т.к. мышка двигается по экрану, как при несвернутом окне. Но хотя бы можно смотреть сериалы, не взаимодействуя с экраном. Жаль, с фоновой работой ничего не вышло.(Отредактировано автором: 17 Января, 2022 - 09:34:15) |
|
|
|