Автоматизация и боты

 Помощь      Поиск      Пользователи
Сайт Кибор     Программируемый кликер Кибор     Видео обучение     Заказать бот

 Страниц (1): [1]   

> Описание: Поиск окна по неполному названию
idcco
Отправлено: 01 Апреля, 2017 - 10:46:32
Post Id



Пользователь
Участник


Покинул форум
Сообщений всего: 67
Дата рег-ции: Март 2017  
Репутация: 5




Может кому-то пригодится поиск окон по неполному названию, где-то видел коммент с просьбой сделать такой поиск окон. Пишите часть названия процесса/окна/контрола и оно находит первый попавшийся по полному совпадению. Чем больше символов напишите, тем выше шанс что найден нужное окно.

Примеры:
1) "Кальк" вернет "Калькулятор" (если открыт).
2) "Блокнот" вернет "Безымянный — Блокнот" (если открыт новый документ в блокноте).
3) "Кибор Бот Автокликер" вернет "Кибор Бот Автокликер :: Поиск окна по неполному названию — Google Chrome" (если открыта данная страница в Хроме).

CODE:
//подключаем ф-и WinApi
external(INT, "FindWindowEx", "FindWindowExA", "user32.dll");
external(VOID, "GetWindowText", "GetWindowTextA", "user32.dll");

function findprocess (string str)
//прописываем ф-ю. ищет запущенный процесс по неполному названию
//находит первый попавшийся при точном совпадении
//возвращает полное название первого найденного процесса
//чем длиннее будет строка поиска тем больше шанс что найдется нужный процесс
{
char chrstr[256];
strcpy (#chrstr[0], str);
char buffer[512];
int strsize, bufsize;
strsize = size (#chrstr[0]);
string processname = "Процесс не найден"; // что оставить в случае не нахождения
int hWnd = FindWindowEx (0, 0, 0, 0);
int s = 0;
int exitwhile = 0;
while (hWnd != 0 && exitwhile == 0)
{
buffer[0] = formatic (0);
GetWindowText (hWnd, address (#buffer[0]), 512);
bufsize = size (#buffer[0]);
s = 0;
for (int i = 0; i < bufsize - strsize + 1; i++)
{
for (int j = 0; j < strsize; j++)
{
if (chrstr[j] == buffer[i + j]) s++;
else { s = 0; j = strsize; }
}
if (s == strsize)
{
processname = format (#buffer[0]);
i = bufsize;
exitwhile = 1;
}
}
hWnd = FindWindowEx (0, hWnd, 0, 0);
}
return processname;
}

//запускаем
string strinput = input ("Какой процесс искать?");
messagebox (findprocess (strinput));


Всем бобра =)

(Отредактировано автором: 01 Апреля, 2017 - 10:48:43)

 
 Top
Kibor
Отправлено: 01 Апреля, 2017 - 11:13:32
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 357




Можно библиотеку создать в файле и подключать через include)
 
 Top
idcco
Отправлено: 01 Апреля, 2017 - 23:05:27
Post Id



Пользователь
Участник


Покинул форум
Сообщений всего: 67
Дата рег-ции: Март 2017  
Репутация: 5




Вот еще один вариант поиска. То же что в первом примере, но ищет совпадения не по всему имени процесса а только если имя начинается с введенной строки. Работает заметно быстрее чем первый вариант (т.к. вырезан один цикл), но не такой универсальный.

Примеры:
1) "Кальк" вернет "Калькулятор" (если открыт).
2) "Блокнот" вернет "Процесс не найден" (т. к. ищет совпадения только с первого символа в имени процесса, а процесс нового документа в блокноте имеет формат "Имя_файла — Блокнот", например: "Безымянный — Блокнот" ).
3) "Кибор Бот Автокликер" вернет "Кибор Бот Автокликер :: Поиск окна по неполному названию — Google Chrome" (если открыта данная страница в Хроме).

CODE:
//подключаем ф-и WinApi
external(INT, "FindWindowEx", "FindWindowExA", "user32.dll");
external(VOID, "GetWindowText", "GetWindowTextA", "user32.dll");

function findprocessf (string str)
//прописываем ф-ю. ищет запущенный процесс по неполному названию
//находит первый попавшийся при точном совпадении с ПЕРВОГО символа названия
//возвращает полное название первого найденного процесса
//чем длиннее будет строка поиска тем больше шанс что найдется нужный процесс
{
char chrstr[256];
strcpy (#chrstr[0], str);
char buffer[512];
int strsize, bufsize;
strsize = size (#chrstr[0]);
string processname = "Процесс не найден"; // что оставить в случае не нахождения
int hWnd = FindWindowEx (0, 0, 0, 0);
int s = 0;
int exitwhile = 0;
while (hWnd != 0 && exitwhile == 0)
{
buffer[0] = formatic (0);
GetWindowText (hWnd, address (#buffer[0]), 512);
bufsize = size (#buffer[0]);
s = 0;
for (int i = 0; i < strsize; i++)
{
if (chrstr[i] == buffer[i]) s++;
else { s = 0; i = strsize; }
if (s == strsize)
{
processname = format (#buffer[0]);
exitwhile = 1;
}
}
hWnd = FindWindowEx (0, hWnd, 0, 0);
}
return processname;
}

//запускаем
string strinput = input ("Какой процесс искать?");
messagebox (findprocessf (strinput));

(Добавление)
Хотя в наше время скоростью обработки можно смело принебрегать. Разница в 10-20 милисекунд совершенно незначительная.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 2 (гостей: 2, зарегистрированных: 0)
« Готовые скрипты »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 




Powered by