Kibor |
Отправлено: 24 Сентября, 2018 - 15:27:15
|
Эксперт
Просматривает форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
KeSeG пишет: если делать так:
CODE:
for(int i=0;i<count;i++)
{
wind.width=457;
wind.height[i]=836;
wind.left[i]=0;
wind.top[i]=0;
movewindow(wind[i])
}
то складывает все их в одну стопку, т.е. не оставляя их на месте.
Конечно. Ведь тут всем окнам указываются одни и те же размеры и позиции.
CODE:win w[2];
w[0]=window ("Калькулятор", "CalcFrame", -1);
w[1]=window ("Безымянный — Блокнот", "Notepad", -1);
int x[2], y[2];
int sx[2], sy[2];
x[0]=10; y[0]=20;sx[0]=200; sy[0]=100;
x[1]=110; y[1]=210;sx[1]=150; sy[1]=200;
for (int n=0; n<2; n++)
{
w.left[n]=x[n];
w.top[n]=y[n];
w.width[n]=sx[n];
w.height[n]=sy[n];
movewindow(w[n]);
}
[i](Добавление)
И еще.
Структура WIN, с помощью которой можно менять размеры, позицию и тд создается только при определение указателя встроенными функциями Кибор.
Если определяется другим способом, то надо ее заполнить полностью руками всю. |
|
|
Zireael |
Отправлено: 23 Октября, 2018 - 02:40:57
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Найти окно по части имени (Отобразить)CODE:external(INT, "FindWindowEx", "FindWindowExA", "user32.dll" );
external(VOID, "GetWindowText", "GetWindowTextA", "user32.dll" );
string R="Блокнот"; // имя окна или часть имени
char c[255];
int handle, x;
string P;
win w;
handle = FindWindowEx(0, 0, 0, 0);
while(handle!=0)
{
GetWindowText (handle, address (#c[0]), 255);
if(regexsearch(1, #P, format(#c[0]), R) > 0)break;
handle=FindWindowEx(0, handle, 0, 0);
}
if(handle!=0)
{
messagebox(format(#c[0])); // полное имя окна
w=window(format(#c[0])); // получить указатель
}
else messagebox("Окно не найдено"); |
|
|
KeSeG |
Отправлено: 31 Января, 2019 - 07:49:09
|
Участник
Покинул форум
Сообщений всего: 52
Дата рег-ции: Сент. 2018
Репутация: 0
|
Пример:
CODE:#include "C:\Program Files\Kibor\include\FindWindow.txt" // загружаем функцию
loop(3)start("C:\Windows\system32\notepad.exe"); // запускаем 3 блокнота
sleep(1000);
win wind[10]; // массив для указателей
int count; // переменная, в которую вернётся количество найденных окон
count=Find_Window(#wind[0], "", "Notepad", 1, 1); // ищем все блокноты, имя не указано, только класс.
messagebox("Найдено окон: "+format(count));
// wind[0] - последнее активное окно, wind[1] - предпоследнее и т. д.
// переименовываем блокноты.
external(INT, "SetWindowText", "SetWindowTextA", "user32.dll");
for(int i=0;i<count;i++)
SetWindowText(formatwi(wind[i]),"Блокнот "+format(i+1));
Вчера работал замечательно, сегодня выдает ошибку.(для просмотра ссылки Вам необходимо авторизоваться)
Сегодня было обновление кибора, возможно конечно проблема с ним не связана... но не знаю на что и грешить, подскажите пожалуйста. |
|
|
KeSeG |
Отправлено: 31 Января, 2019 - 08:04:42
|
Участник
Покинул форум
Сообщений всего: 52
Дата рег-ции: Сент. 2018
Репутация: 0
|
Он из первого поста автора:
CODE:function Find_Window(win #w, string name, string class, int full_name, int full_class)
{
external(INT, "FindWindowEx", "FindWindowExA", "user32.dll");
external(VOID, "GetClassName", "GetClassNameA", "user32.dll");
external(VOID, "GetWindowText", "GetWindowTextA", "user32.dll");
char array[255];
int n=0, handle;
if(name == "" && class == "") // если не указаны имя и класс
{
return 0;
}
if(name != "" && class != "") // поиск по имени и классу
{
// имя окна и класс указаны полностью
if(full_name==1 && full_class==1)
{
handle=FindWindowEx(0, 0, class, name);
while (handle!=0)
{
w[n]=formatiw(handle); n++;
handle=FindWindowEx(0, handle, class, name);
}
return n;
}
// имя указано полностью, класс частично
if(full_name==1 && full_class==0)
{
handle = FindWindowEx(0, 0, 0, name);
GetClassName (handle, address (#array[0]), 255);
while (handle!=0)
{
if(find_str(format(#array[0]), class, full_class) == 1)
{
w[n]=formatiw(handle); n++;
}
handle=FindWindowEx(0, handle, 0, name);
GetClassName (handle, address (#array[0]), 255);
}
return n;
}
// имя указано частично, класс полностью
if(full_name==0 && full_class==1)
{
handle = FindWindowEx(0, 0, class, 0);
GetWindowText (handle, address (#array[0]), 255);
while (handle!=0)
{
if(find_str(format(#array[0]), name, full_name) == 1)
{
w[n]=formatiw(handle); n++;
}
handle=FindWindowEx(0, handle, class, 0);
GetWindowText (handle, address (#array[0]), 255);
}
return n;
}
// имя указано частично, класс частично
if(full_name==0 && full_class==0)
{
handle = FindWindowEx(0, 0, 0, 0);
GetClassName (handle, address (#array[0]), 255);
while (handle!=0)
{
if(find_str(format(#array[0]), class, full_class) == 1)
{
GetWindowText (handle, address (#array[0]), 255);
if(find_str(format(#array[0]), name, full_name) == 1)
{
w[n]=formatiw(handle); n++;
}
}
handle=FindWindowEx(0, handle, 0, 0);
GetClassName (handle, address (#array[0]), 255);
}
return n;
}
}
if(name=="") // поиск по классу, имя не указано
{
if(full_class==1)
{
handle = FindWindowEx(0, 0, class, 0);
while (handle!=0)
{
w[n]=formatiw(handle); n++;
handle=FindWindowEx(0, handle, class, 0);
}
}
else
{
handle = FindWindowEx(0, 0, 0, 0);
GetClassName (handle, address (#array[0]), 255);
while (handle!=0)
{
if(find_str(format(#array[0]), class, full_class) == 1)
{
w[n]=formatiw(handle); n++;
}
handle = FindWindowEx(0, handle, 0, 0);
GetClassName (handle, address (#array[0]), 255);
}
}
}
else // поиск по имени, класс не указан
{
if(full_name==1)
{
handle = FindWindowEx(0, 0, 0, name);
while (handle!=0)
{
w[n]=formatiw(handle); n++;
handle=FindWindowEx(0, handle, 0, name);
}
}
else
{
handle = FindWindowEx(0, 0, 0, 0);
GetWindowText (handle, address (#array[0]), 255);
while (handle!=0)
{
if(find_str(format(#array[0]), name, full_name) == 1)
{
w[n]=formatiw(handle); n++;
}
handle = FindWindowEx(0, handle, 0, 0);
GetWindowText (handle, address (#array[0]), 255);
}
}
}
return n;
function find_str(string s1, string s2, int full)
{
int i=0, j=0, len1=size(s1),len2=size(s2);
char tmp1[255], tmp2[255];
string temp="";
strcpy(#tmp1[0], s1); strcpy(#tmp2[0], s2);
while(i <= len1 - len2 && temp != s2)
{
temp="";
if(full==0){while(tmp1[i]!=tmp2[0] && i < len1 - len2)i++;}j=0;
while(tmp1[i]==tmp2[j] && i < len1){temp=temp+tmp1[i]; i++; j++;}i++;
}
if(temp == s2)return 1;
else return 0;
}
} |
|
|
Zireael |
Отправлено: 31 Января, 2019 - 22:50:24
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Поиск нескольких окон с одинаковым именем или классом (Отобразить)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" );
external(INT, "GetWindowInfo", "GetWindowInfo", "User32.dll" );
win w[10]; // массив для 10 окон, переменная w используется в structure_win, т. к. нельзя заполнить структуру win через указатель
// Имя и класс окна можно указать частично. Для латиницы регистр игнорируется.
// для примера поиск всех окон блокнота
string name="Блокнот"; // имя окна, можно не указывать если указан класс окна
string class="Notepad"; // класс окна, можно не указывать если указано имя окна
new int handle[sizearray(w)]; // временный массив для хендлов
// вызов функции поиска окон
int z=find_window(name, class, #handle[0], sizearray(handle)); // передаётся: имя окна, класс окна, указатель на массив для хенлов, размер массива
// вызов функции заполнения структуры win
structure_win(z, #handle[0], sizearray(handle)); // заполнить структуру win, передаётся: количество окон, указатель на массив для хенлов, размер массива
delete handle;
// дальше сам скрипт
messagebox("Найдено окон: "+format(z));
for(int i=0; i<z; i++)messagebox(w.name[i]); // имена всех найденных окон
// w[0] - первое запущенное окно
// w[1] - второе запущенное окно
// и т. д.
// функция поиска окон, возвращает количество найденных окон
function find_window(string name_window, string class_window, int #hh, int size_hh)
{
if(name_window=="" && class_window==""){messagebox("Нужно указать имя или класс окна"); return 0;}
new int handle_array[size_hh][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 && count_window<size_hh; 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]){hh[win_count]=handle_array[i][1]; win_count++;}}
process=Process32Next(h, address(#c1[0]));
}
CloseHandle(h);
delete handle_array;
return win_count;
}
function structure_win(int count_window, int #hh, int size_hh)
{
char c[255];
int info[15];
writeaddress(sizearray(info)*4, address(#info[0]));
for(int i=0; i<size_hh; i++)
{
w[i]=formatiw(hh[i]);
if(GetWindowText(hh[i], address(#c[0]), sizearray(c)))w.name[i]=format(#c[0]);
if(GetClassName(hh[i], address(#c[0]), sizearray(c)))w.class[i]=format(#c[0]);
if(GetWindowInfo(hh[i], address(#info[0])))
{
w.width[i]=info[3]-info[1]; w.height[i]=info[4]-info[2]; w.left[i]=info[1]; w.top[i]=info[2]; w.widthclient[i]=info[7]-info[5];
w.heightclient[i]=info[8]-info[6]; w.leftclient[i]=info[5]; w.topclient[i]=info[6];
}
}
}
Переделал. Структура win теперь тоже заполняется. В массиве окна упорядочены в порядке их запуска. |
|
|
KeSeG |
Отправлено: 02 Февраля, 2019 - 08:48:52
|
Участник
Покинул форум
Сообщений всего: 52
Дата рег-ции: Сент. 2018
Репутация: 0
|
Zireael Опять что то не такс новым FindWindow.txt
CODE:#include "C:\Program Files\Kibor\include\FindWindow.txt" // загружаем функцию
loop(3)start("C:\Windows\system32\notepad.exe"); // запускаем 3 блокнота
sleep(1000);
win wind[10]; // массив для указателей
int count; // переменная, в которую вернётся количество найденных окон
count=Find_Window(#wind[0], "", "Notepad", 1, 1); // ищем все блокноты, имя не указано, только класс.
messagebox("Найдено окон: "+format(count));
// wind[0] - последнее активное окно, wind[1] - предпоследнее и т. д.
// переименовываем блокноты.
external(INT, "SetWindowText", "SetWindowTextA", "user32.dll");
for(int i=0;i<count;i++)
SetWindowText(formatwi(wind[i]),"Блокнот "+format(i+1));
Сначала выдает ошибку:(для просмотра ссылки Вам необходимо авторизоваться)
ну тут вроде все ок, прост переменная уже была обозначена в FindWindow.txt
заменяю i на j
CODE:#include "C:\Program Files\Kibor\include\FindWindow.txt" // загружаем функцию
loop(3)start("C:\Windows\system32\notepad.exe"); // запускаем 3 блокнота
sleep(1000);
win wind[10]; // массив для указателей
int count; // переменная, в которую вернётся количество найденных окон
count=Find_Window(#wind[0], "", "Notepad", 1, 1); // ищем все блокноты, имя не указано, только класс.
messagebox("Найдено окон: "+format(count));
// wind[0] - последнее активное окно, wind[1] - предпоследнее и т. д.
// переименовываем блокноты.
external(INT, "SetWindowText", "SetWindowTextA", "user32.dll");
for(int j=0;j<count;j++)
SetWindowText(formatwi(wind[j]),"Блокнот "+format(j+1));
выдает ошибку (для просмотра ссылки Вам необходимо авторизоваться) потом (для просмотра ссылки Вам необходимо авторизоваться)
ну и естественно не переименовывает. Со старым - работает. |
|
|
Zireael |
Отправлено: 02 Февраля, 2019 - 10:31:09
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Это в файл FindWindow.txt:
Содержимое файла FindWindow.txt (Отобразить)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" );
external(INT, "GetWindowInfo", "GetWindowInfo", "User32.dll" );
// функция поиска окон, возвращает количество найденных окон
function find_window(string name_window, string class_window, int #hh, int size_hh)
{
if(name_window=="" && class_window==""){messagebox("Нужно указать имя или класс окна"); return 0;}
new int handle_array[size_hh][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 && count_window<size_hh; 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]){hh[win_count]=handle_array[i][1]; win_count++;}}
process=Process32Next(h, address(#c1[0]));
}
CloseHandle(h);
delete handle_array;
return win_count;
}
function structure_win(int count_window, int #hh, int size_hh)
{
char c[255];
int info[15];
writeaddress(sizearray(info)*4, address(#info[0]));
for(int i=0; i<size_hh; i++)
{
w[i]=formatiw(hh[i]);
if(GetWindowText(hh[i], address(#c[0]), sizearray(c)))w.name[i]=format(#c[0]);
if(GetClassName(hh[i], address(#c[0]), sizearray(c)))w.class[i]=format(#c[0]);
if(GetWindowInfo(hh[i], address(#info[0])))
{
w.width[i]=info[3]-info[1]; w.height[i]=info[4]-info[2]; w.left[i]=info[1]; w.top[i]=info[2]; w.widthclient[i]=info[7]-info[5];
w.heightclient[i]=info[8]-info[6]; w.leftclient[i]=info[5]; w.topclient[i]=info[6];
}
}
}
Пример использования:
code (Отобразить)CODE:#include "C:\Program Files\Kibor\include\FindWindow.txt" // загружаем функцию
external(INT, "SetWindowText", "SetWindowTextA", "user32.dll");
loop(3)start("C:\Windows\system32\notepad.exe"); // запускаем 3 блокнота
sleep(1000);
win w[10]; // массив для 10 окон, переменная w используется в structure_win, т. к. нельзя заполнить структуру win через указатель
// Имя и класс окна можно указать частично. Для латиницы регистр игнорируется.
// для примера поиск всех окон блокнота
string name="Блокнот"; // имя окна, можно не указывать если указан класс окна
string class="Notepad"; // класс окна, можно не указывать если указано имя окна
new int handle[sizearray(w)]; // временный массив для хендлов
// вызов функции поиска окон
int z=find_window(name, class, #handle[0], sizearray(handle)); // передаётся: имя окна, класс окна, указатель на массив для хенлов, размер массива
// вызов функции заполнения структуры win
structure_win(z, #handle[0], sizearray(handle)); // заполнить структуру win, передаётся: количество окон, указатель на массив для хенлов, размер массива
delete handle;
messagebox("Найдено окон: "+format(z));
// w[0] - первое запущенное окно
// w[1] - второе запущенное окно
// и т. д.
// переименовываем блокноты.
for(int i=0;i<z;i++)
SetWindowText(formatwi(w[i]),"Блокнот "+format(i+1)); |
|
|
|