Кибор » Кибор - Интегрированная среда разработки ботов » Готовые скрипты » Поиск окна по неполному названию

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

1. idcco - 01 Апреля, 2017 - 02:46:32 - перейти к сообщению
Может кому-то пригодится поиск окон по неполному названию, где-то видел коммент с просьбой сделать такой поиск окон. Пишите часть названия процесса/окна/контрола и оно находит первый попавшийся по полному совпадению. Чем больше символов напишите, тем выше шанс что найден нужное окно.

Примеры:
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));


Всем бобра =)
2. Kibor - 01 Апреля, 2017 - 03:13:32 - перейти к сообщению
Можно библиотеку создать в файле и подключать через include)
3. idcco - 01 Апреля, 2017 - 15:05:27 - перейти к сообщению
Вот еще один вариант поиска. То же что в первом примере, но ищет совпадения не по всему имени процесса а только если имя начинается с введенной строки. Работает заметно быстрее чем первый вариант (т.к. вырезан один цикл), но не такой универсальный.

Примеры:
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 милисекунд совершенно незначительная.

Powered by ExBB FM 1.0 Final