Duat |
Отправлено: 19 Января, 2022 - 12:41:02
|
Наблюдатель
Покинул форум
Сообщений всего: 39
Дата рег-ции: Окт. 2018
Репутация: 0
|
Добрый день. Столкнулся с весьма интересной ситуацией.
Имеется окно, к которому нужно привязаться, чтобы работало в фоновом режиме.
Имя собранного exe файла = имя окна, к которому нужно "привязаться".
Имя окна в шпионе выглядит так:
CODE:window ("WoW - Stepway", "trinityWindow", -1)
Соответственно Exe-файл называем "WoW - Stepway".
Имя exe-шника получаем следующим образом:
CODE:external(INT, "GetCommandLine", "GetCommandLineA", "Kernel32.dll");
int adres = GetCommandLine();
int i=0;
string command="";
loop()
{
char c = addressc(adres+i);
if(formatci(c) == 0)break;
command=command+c;
i++;
}
string name_exe;
messagebox(command);
regexreplace(-1, #command, command, "\^"", ""); // удалить кавычки
regexreplace(-1, #command, command, ".exe", ""); // удалить .exe
regexsearch(1, #name_exe, command, "[^\\]+", RIGHTTOLEFT); // найти имя exe
messagebox(name_exe);
Делаем привязку к окну:
CODE:win W_Kib=window (name_exe, "trinityWindow", -1);
pause(1000);
if (W_Kib==0)messagebox ("окна нет");
Поидее должно получаться, но exe-файл не может найти окно..
Если вручную прописать имя, то все нормально привязывается:
CODE:external(INT, "GetCommandLine", "GetCommandLineA", "Kernel32.dll");
int adres = GetCommandLine();
int i=0;
string command="";
loop()
{
char c = addressc(adres+i);
if(formatci(c) == 0)break;
command=command+c;
i++;
}
command="C:\kibor\WoW - Stepway.exe";
string name_exe;
messagebox(command);
regexreplace(-1, #command, command, "\^"", ""); // удалить кавычки
regexreplace(-1, #command, command, ".exe", ""); // удалить .exe
regexsearch(1, #name_exe, command, "[^\\]+", RIGHTTOLEFT); // найти имя exe
messagebox(name_exe);
Что нужно сделать, чтобы exe-файл мог привязаться к окну?(Отредактировано автором: 19 Января, 2022 - 12:43:14) |
|
|
Zireael |
Отправлено: 19 Января, 2022 - 14:02:15
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Что нужно сделать, чтобы exe-файл мог привязаться к окну?
CODE:regexreplace(1, #name_exe, name_exe, " ", "", RIGHTTOLEFT); // удалить пробел в конце строки |
|
|
Zireael |
Отправлено: 20 Января, 2022 - 01:05:05
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Совет с удалением пробела в конце, не помог. Все равно не видит окно..
Значит что-то не так сделали, так работает.
CODE:external(INT, "GetCommandLine", "GetCommandLineA", "Kernel32.dll");
int adres = GetCommandLine();
int i=0;
string command="";
loop()
{
char c = addressc(adres+i);
if(formatci(c) == 0)break;
command=command+c;
i++;
}
string name_exe;
//messagebox(command);
regexreplace(-1, #command, command, "\^"", ""); // удалить кавычки
regexreplace(-1, #command, command, ".exe\s*", ""); // удалить .exe и пробел если есть
regexsearch(1, #name_exe, command, "[^\\]+", RIGHTTOLEFT); // найти имя exe
//messagebox(name_exe);
win W_Kib = window (name_exe, "trinityWindow", -1);
if(W_Kib==0)messagebox ("окна нет");
else messagebox ("окно есть");
|
|
|
Kibor |
Отправлено: 20 Января, 2022 - 17:09:00
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Данный скрипт позволяет запускать всего один EXE бота нужное количество раз (сколько окон игры) и каждая копия привяжется автоматически к своему окну игры.
Не зависим от названий окон игры.
Код (Отобразить)CODE:win w_bot[10];
int k_bot=window (#w_bot[0], "bots");//Получаем указатели на все боты которые имеют имена bots
win w_game[10];
int k_game=window (#w_game[0], -1, "Notepad", -1);//Получаем указатели на все окна игр (Блокнотов)
char ch[100];
string S;
win W;//Указатель в который запишется указатель на привязанное окно
for (int n1=0; n1<k_game; n1++)//Перебираем все окна игр
{
S=format(formatwi(w_game[n1]));//Приводим HWND игры к string
for (int n=0; n<k_bot; n++)//Перебираем все окна ботов
{
if (gethwnd()!=formatwi(w_bot[n]))// если это указатель не на этот бот
{
readbuffer(#ch[0], 100, w_bot[n]);//Читаем с буфера программы на которую указывает указатель w_bot[n]
if (format(#ch[0])==S) goto aa;//Если в буфере какого то бота записан этот указатель на эту игру, переходим к следующему указателю на следующую игру
}
}
W=w_game[n1];//Если ни у одного бота не записан указатель на эту игру - присваеваем его в W
setwindowparam(W);//Обновляем структуру указателя W
strcpy(#ch[0], S);
writebuffer(#ch[0], size(S));//Запишем в свой буфер указатель на эту игру что бы другие боты знали что этот бот привязан у этой игре
rename(format(formatwi(W))+"-"+W.name);//Меняем заголовок бота
aa:;
}
loop()//Основной цикл бота
{
sleep(100);
}
CREATE_INTERFACE
{
DIALOG "bots" 337 180 //РазмерX РазмерY
BUTTONSCRIPT "Запустить" 225 121 100 25 //ПозицияX ПозицияY РазмерX РазмерY
//Добавление контролов управления ......
}
EXE бота надо переименовать в "bots.exe"
1 - Запустим 3 окна игры (в данном случае блокнота)
2 - Запустим 3 копии bots.exe
3 - Нажмем в каждой - Запустить
4 - Через пару секунд нажмем конрл шифт Z и остановим боты.
5 - Увидим что названия ботов поменялись и приняли заголовки окон блокнотов к которым привязаны.
Работает по принципу проверки буферов всех ботов, в которые они записывают к какому окну привязались. Обмен данными между программами и скриптами
|
|
|
|