Zireael |
Отправлено: 22 Января, 2018 - 15:48:26
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Функция поиска нескольких окон с одинаковым именем и/или классом. (Отобразить)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;
}
}
Возвращает количество найденных окон.
В массиве окна упорядочены в порядке их последней активности. Т. е. первым будет последнее активное окно, вторым предпоследнее и т. д.
Допускается указывать часть имени и/или класса.
Синтаксис:
CODE:win wind[10]; // массив для указателей на окна
int count; // переменная, в которую вернётся количество найденных окон
count=Find_Window(#wind[0], "Блокнот", "Notepad", 0, 1); // вызов функции
1й параметр - указатель на массив win.
2й параметр - имя окна или часть имени. Если имени нет или не нужно учитывать, то пишем "".
3й параметр - класс окна или часть класса. Если класс не нужно учитывать, то пишем "".
4й параметр - флаг полного имени окна. 0 - указана часть имени окна, 1 - указано полное имя окна. Если имя не указано параметр игнорируется.
5й параметр - флаг полного имени класса. 0/1. Если класс не указан параметр игнорируется.
Если флаг 1, то окно будет найдено при полном совпадении имени/класса.
Если флаг 0, то будет искать указанную часть в имени/классе. Т. е., если указать имя "Блокнот" и не указывать класс, то будут найдены все окна, в имени которых содержится текст 'Блокнот'.
Сохранить функцию в txt файл, загружать через include.
Пример (Отобразить)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)); |
|
|
Zireael |
Отправлено: 26 Мая, 2018 - 22:05:21
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Можно ли как-то самому узнать размеры экрана по win переменной?
Наверное, размеры окна, а не экрана.
На примере блокнота:
CODE:#include "C:\Program Files\Kibor\include\FindWindow.txt" // загружаем функцию
start("C:\Windows\system32\notepad.exe"); // запускаем блокнот
while(window(-1,"Notepad", -1)==0)sleep(100); // ждём когда блокнот откроется
win wind[10];
int count;
count=Find_Window(#wind[0], "", "Notepad", 1, 1);
external(INT, "GetClientRect", "GetClientRect", "user32.dll");
external(INT, "GetWindowRect", "GetWindowRect", "user32.dll");
int pos[4], rect[4];
GetClientRect(formatwi(wind[0]), address(#rect[0])); // получаем размеры клиента
GetWindowRect(formatwi(wind[0]), address(#pos[0])); // получаем позицию окна
messagebox(format(rect[0])+" "+format(rect[1])+" "+format(rect[2])+" "+format(rect[3]));
messagebox(format(pos[0])+" "+format(pos[1])+" "+format(pos[2])+" "+format(pos[3])); |
|
|
Zireael |
Отправлено: 24 Сентября, 2018 - 14:36:26
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: wind[i].width=457;
Похоже что movewindow не работает с массивами.
CODE:#include "D:\FindWindow.txt"
external(INT, "SetWindowPos", "SetWindowPos", "User32.dll");
win wind[10];
int count;
count=Find_Window(#wind[0], "", "Notepad", 1, 1);
for(int i=0;i<count;i++)
{
SetWindowPos(formatwi(wind[i]), -2, 0, 0, 836, 457, 2); // изменит размеры окна, положение не изменится
// SetWindowPos(formatwi(wind[i]), -2, 100, 50, 836, 457, 0); // изменит размеры и положение
}
Описание SetWindowPos https://docs.microsoft.com/en-us...ser-setwindowpos |
|
|
Kibor |
Отправлено: 24 Сентября, 2018 - 14:44:43
|
Эксперт
Просматривает форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Zireael , Работает
CODE:win w[5];
w[1]=window ("Безымянный — Блокнот", "Notepad", -1);
w.width[1]=5;
movewindow(w[1]);
KeSeG пишет: wind[i].width
Не так тут.
Так надо.
|
|
|
KeSeG |
Отправлено: 24 Сентября, 2018 - 14:56:15
|
Участник
Покинул форум
Сообщений всего: 52
Дата рег-ции: Сент. 2018
Репутация: 0
|
Zireael , Kibor , Спасибо большое. И тот и тот вариант работают. Проблема в том, что если делать так:
CODE:
for(int i=0;i<count;i++)
{
wind.width[i]=457;
wind.height[i]=836;
movewindow(wind);
}
Он меняет размер, но по всей видимости выносит положение окон за пределы видимости.
если делать так:
CODE:for(int i=0;i<count;i++)
{
wind.width[i]=457;
wind.height[i]=836;
wind.left[i]=0;
wind.top[i]=0;
movewindow(wind[i])
}
то складывает все их в одну стопку, т.е. не оставляя их на месте.(Отредактировано автором: 24 Сентября, 2018 - 14:56:37) |
|
|
|