1. Arimor - 15 Ноября, 2020 - 05:31:15 - перейти к сообщению
У меня есть 30 открытых окон, я получаю на них указатель путем наведения курсора на каждый. Как можно упростить задачу?
2. Zireael - 15 Ноября, 2020 - 05:38:29 - перейти к сообщению
Найти их. Имя и класс окна разные, одинаковые, частично совпадают?
3. Arimor - 15 Ноября, 2020 - 06:06:33 - перейти к сообщению
Zireael пишет:
Найти их. Имя и класс окна разные, одинаковые, частично совпадают?
Всё одинаковое, только расположении окон разные.
4. Zireael - 15 Ноября, 2020 - 06:15:29 - перейти к сообщению
Поиск окон (Отобразить)
5. Arimor - 15 Ноября, 2020 - 07:26:50 - перейти к сообщению
Zireael , у меня он почему-то ошибку выдает
(Добавление)
в отладке
(Добавление)
в отладке
CODE:
GetClassName ( handle_window [ i ] , address ( # c3 [ 0 ] ) , sizearray ( c3 ) )
if ( regexsearch ( 1 , # temp , format ( # c2 [ 0 ] ) , name_window , IGNORECASE ) && regexsearch ( 1 , # temp2 , format ( # c3 [ 0 ] ) , class_window , IGNORECASE ) )
h = CreateToolhelp32Snapshot ( 2 , 0 )
GetClassName ( handle_window [ i ] , address ( # c3 [ 0 ] ) , sizearray ( c3 ) )
if ( regexsearch ( 1 , # temp , format ( # c2 [ 0 ] ) , name_window , IGNORECASE ) && regexsearch ( 1 , # temp2 , format ( # c3 [ 0 ] ) , class_window , IGNORECASE ) )
h = CreateToolhelp32Snapshot ( 2 , 0 )
6. Zireael - 15 Ноября, 2020 - 07:33:25 - перейти к сообщению
Добавить в начало:
CODE:
external(INT, "CreateToolhelp32Snapshot", "CreateToolhelp32Snapshot", "Kernel32.dll");
7. Arimor - 15 Ноября, 2020 - 08:00:20 - перейти к сообщению
Таким способом не отправляются нажатия кнопок в блокнот
CODE:
external(INT, "CreateToolhelp32Snapshot", "CreateToolhelp32Snapshot", "Kernel32.dll");
external(INT, "GetWindowThreadProcessId", "GetWindowThreadProcessId", "User32.dll" );
external(INT, "CloseHandle", "CloseHandle", "Kernel32.dll" );
external(INT, "Process32First", "Process32First", "Kernel32.dll" );
external(INT, "Process32Next", "Process32Next", "Kernel32.dll" );
external(INT, "FindWindowEx", "FindWindowExA", "User32.dll" );
external(INT, "GetWindowText", "GetWindowTextA", "User32.dll" );
external(INT, "GetClassName", "GetClassNameA", "User32.dll" );
win w[99]; // массив для окон
// Имя и класс окна можно указать частично. Для латиницы регистр игнорируется.
// для примера поиск всех окон блокнота
string name="Блокнот"; // имя окна, можно не указывать если указан класс окна
string class="Notepad"; // класс окна, можно не указывать если указано имя окна
// вызов функции поиска окон
int count_window=find_window(name, class, #w[0]); // передаётся: имя окна, класс окна, указатель на массив win
messagebox("Найдено окон: "+format(count_window));
for(int i=0; i<count_window; i++)setwindowparam(w[i]); // заполнение структуры win
sendkey("asd", 0, w[1]);
sendkey("qww", 1, w[1]);
sendkey("dsd", w[1]);
sendkey("asd", 0, w[0]);
sendkey("qww", 1, w[0]);
sendkey("dsd", w[0]);
// дальше сам скрипт
// w[0] - первое запущенное окно
// w[1] - второе запущенное окно
// и т. д.
for(int j=0; j<count_window; j++)messagebox(w.name[j]); // имена всех найденных окон
// функция поиска окон, возвращает количество найденных окон
function find_window(string name_window, string class_window, win #ww)
{
if(name_window=="" && class_window==""){messagebox("Нужно указать имя или класс окна"); return 0;}
int handle_array[999][2];
string temp, temp2;
int i, h, process, pid, count_window=0, win_count=0, count_handle=0;
int handle_window[9999];
char c1[255], c2[255], c3[255];
writeaddress(sizearray(c1), address(#c1[3]));
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++)
{
GetWindowText(handle_window[i], address(#c2[0]), sizearray(c2));
GetClassName(handle_window[i], address(#c3[0]), sizearray(c3));
if(regexsearch(1, #temp, format(#c2[0]), name_window, IGNORECASE) && regexsearch(1, #temp2, format(#c3[0]), class_window, IGNORECASE))
{
GetWindowThreadProcessId(handle_window[i], address(#pid)); handle_array[count_window][0]=pid; handle_array[count_window][1]=handle_window[i]; count_window++;
}
}
h=CreateToolhelp32Snapshot(2, 0); process=Process32First(h, address(#c1[0]));
while(process)
{
for(i=0; i<count_window; i++){if(codhexi(#c1[8], 4)==handle_array[i][0]){ww[win_count]=formatiw(handle_array[i][1]);win_count++;}}
process=Process32Next(h, address(#c1[0]));
}
CloseHandle(h);
return win_count;
}
external(INT, "GetWindowThreadProcessId", "GetWindowThreadProcessId", "User32.dll" );
external(INT, "CloseHandle", "CloseHandle", "Kernel32.dll" );
external(INT, "Process32First", "Process32First", "Kernel32.dll" );
external(INT, "Process32Next", "Process32Next", "Kernel32.dll" );
external(INT, "FindWindowEx", "FindWindowExA", "User32.dll" );
external(INT, "GetWindowText", "GetWindowTextA", "User32.dll" );
external(INT, "GetClassName", "GetClassNameA", "User32.dll" );
win w[99]; // массив для окон
// Имя и класс окна можно указать частично. Для латиницы регистр игнорируется.
// для примера поиск всех окон блокнота
string name="Блокнот"; // имя окна, можно не указывать если указан класс окна
string class="Notepad"; // класс окна, можно не указывать если указано имя окна
// вызов функции поиска окон
int count_window=find_window(name, class, #w[0]); // передаётся: имя окна, класс окна, указатель на массив win
messagebox("Найдено окон: "+format(count_window));
for(int i=0; i<count_window; i++)setwindowparam(w[i]); // заполнение структуры win
sendkey("asd", 0, w[1]);
sendkey("qww", 1, w[1]);
sendkey("dsd", w[1]);
sendkey("asd", 0, w[0]);
sendkey("qww", 1, w[0]);
sendkey("dsd", w[0]);
// дальше сам скрипт
// w[0] - первое запущенное окно
// w[1] - второе запущенное окно
// и т. д.
for(int j=0; j<count_window; j++)messagebox(w.name[j]); // имена всех найденных окон
// функция поиска окон, возвращает количество найденных окон
function find_window(string name_window, string class_window, win #ww)
{
if(name_window=="" && class_window==""){messagebox("Нужно указать имя или класс окна"); return 0;}
int handle_array[999][2];
string temp, temp2;
int i, h, process, pid, count_window=0, win_count=0, count_handle=0;
int handle_window[9999];
char c1[255], c2[255], c3[255];
writeaddress(sizearray(c1), address(#c1[3]));
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++)
{
GetWindowText(handle_window[i], address(#c2[0]), sizearray(c2));
GetClassName(handle_window[i], address(#c3[0]), sizearray(c3));
if(regexsearch(1, #temp, format(#c2[0]), name_window, IGNORECASE) && regexsearch(1, #temp2, format(#c3[0]), class_window, IGNORECASE))
{
GetWindowThreadProcessId(handle_window[i], address(#pid)); handle_array[count_window][0]=pid; handle_array[count_window][1]=handle_window[i]; count_window++;
}
}
h=CreateToolhelp32Snapshot(2, 0); process=Process32First(h, address(#c1[0]));
while(process)
{
for(i=0; i<count_window; i++){if(codhexi(#c1[8], 4)==handle_array[i][0]){ww[win_count]=formatiw(handle_array[i][1]);win_count++;}}
process=Process32Next(h, address(#c1[0]));
}
CloseHandle(h);
return win_count;
}
8. Zireael - 15 Ноября, 2020 - 08:06:05 - перейти к сообщению
Цитата:
Таким способом не отправляются нажатия кнопок в блокнот
В блокноте надо отправлять нажатия в контрол, а не главное окно.
CODE:
sendkey("asd", window (-1, "Edit", window (w.name[0], w.class[0], -1)));
9. Arimor - 15 Ноября, 2020 - 08:06:55 - перейти к сообщению
Но это только в блокнот не пишет, а в игре нормально всё проходит.
10. Zireael - 15 Ноября, 2020 - 08:12:18 - перейти к сообщению
Цитата:
Но это только в блокнот не пишет, а в игре нормально всё проходит.
У игры нет контролов, поэтому нажатия отправляются в окно. Посмотрите в шпионе.