function TForm1.Find(s: string): hWnd;
var
Wnd: hWnd;
buff: array[0..127] of Char;
begin
Find := 0;
Wnd := GetWindow(Handle, gw_HWndFirst);
while Wnd <> 0 dobeginif (Wnd <> Application.Handle) and
IsWindowVisible(Wnd) and
(GetWindow(Wnd, gw_Owner) = 0) and
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0) thenbegin
GetWindowText(Wnd, buff, sizeof(buff));
if pos(s, StrPas(buff)) > 0 thenbegin
Find := Wnd;
Break;
end;
end;
Wnd := GetWindow(Wnd, gw_hWndNext);
end;
end;
Перевод контента на русский язык:
Функция Find предназначена для поиска окна с заголовком, содержащим заданную строку. Строка может быть частичным совпадением, и поиск выполняется путем перебора всех верхних уровней окон в системе.
Работает она следующим образом:
Начинается с получения первого верхнего уровня окна с помощью GetWindow(Handle, gw_HWndFirst).
Затем enters цикл, который продолжается до тех пор, пока не будет найдено совпадение или не останется окон для поиска.
Внутри цикла проверяется, является ли текущее окно видимым (IsWindowVisible(Wnd)), не принадлежит ли оно другому окну (GetWindow(Wnd, gw_Owner) = 0) и имеет ли оно не пустой заголовок (GetWindowText(Wnd, buff, sizeof(buff)) <> 0).
Если эти условия выполняются, то получается текст заголовка окна с помощью GetWindowText и проверяется, содержится ли заданная строка (s) в заголовке с помощью pos. Если это так, то устанавливается результат в текущее окно (Find := Wnd) и цикл прерывается.
Если не будет найдено совпадение, функция возвращает 0.
Преимущества этого подхода:
Он эффективен, потому что поиск ограничен только верхними уровнями окон, которые обычно меньше, чем все окна в системе.
Использует простой алгоритм поиска строк (pos) для нахождения частичных совпадений, что делает его легко реализуемым и поддерживаемым.
Однако есть некоторые потенциальные недостатки:
Функция не обрабатывает символы, не являющиеся ASCII-кодированными. Если вам нужно поддерживать заголовки Unicode, вы можете использовать GetWindowTextW вместо GetWindowText.
Функция поиска ограничена только верхними уровнями окон. Если вам нужно найти дочерние окна или окна, принадлежащие другому окну, вам потребуется более сложный алгоритм.
Функция возвращает handle окна первого совпадающего окна, которое она находит. Если есть несколько совпадений, функция вернет только одно из них.
Альтернативное решение может быть использование API-функции FindWindow из Windows, которая предназначена для поиска верхних уровней окон с заданным заголовком или именем класса. Эта функция может быть более эффективной и легкой в использовании, чем реализация вашего алгоритма. Однако она ограничена только поиском верхних уровней окон, а не дочерних окон.
Вот пример, как можно модифицировать функцию для использования FindWindow:
function TForm1.Find(s: string): hWnd;
begin
Result := FindWindow(nil, PChar(s));
end;
Эта версия функции проще и более эффективна, чем оригинальная реализация. Однако она ограничена только поиском верхних уровней окон с заданным заголовком. Если вам нужно найти дочерние окна или окна, принадлежащие другому окну, вам все еще потребуется использовать оригинальную реализацию.
Статья рассказывает о функции TForm1.Find, которая позволяет найти окно по неполному названию.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.