Когда мы работаем с программами на языке Object Pascal, например, в среде Delphi, часто возникает необходимость получать информацию о текущих окнах системы. Одной из таких задач является получение списка заголовков активных окон. Заголовок окна – это текст, который отображается в верхней части окна, например, "Блокнот", "Total Commander".
Для решения этой задачи можно использовать функцию перечисления окон EnumWindows, которая позволяет перебрать все окна системы. Однако, стандартное использование этой функции может приводить к получению списка окон, включая всплывающие подсказки, элементы управления и другие элементы пользовательского интерфейса, которые не являются основными окнами, которые можно активировать с помощью сочетания клавиш Alt+Tab или которые имеют иконки в панели задач.
Чтобы получить список только основных окон, необходимо установить определенные критерии для фильтрации. Согласно документации MSDN, основные окна должны быть видимыми, не владеть другими окнами и иметь стиль WS_EX_APPWINDOW. Программа, приведенная ниже, демонстрирует, как можно перечислить такие окна:
program EnumTaskbarWindows;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
var
s: string;
len: Integer;
IsVisible, IsOwned, IsAppWindow: Boolean;
begin
Result := True; // Продолжаем перечисление
IsVisible := IsWindowVisible(hwnd);
if not IsVisible then
exit;
IsOwned := GetWindow(hwnd, GW_OWNER) <> 0;
if IsOwned then
exit;
IsAppWindow := GetWindowLongPtr(hwnd, GWL_EXSTYLE) and WS_EX_APPWINDOW <> 0;
if not IsAppWindow then
exit;
len := GetWindowTextLength(hwnd);
if len = 0 then
exit;
SetLength(s, len);
GetWindowText(hwnd, PChar(s), len+1);
Writeln(s);
end;
begin
EnumWindows(@EnumWindowsProc, 0);
end.
Этот код перечисляет окна, которые удовлетворяют заданным критериям, и выводит их заголовки в консоль. Обратите внимание, что при работе с функциями операционной системы важно учитывать особенности конкретной версии Windows, так как поведение некоторых функций может отличаться.
При использовании данного кода важно помнить о безопасности и избегать вызова функций, которые могут вызвать доступ к неинициализированной памяти, например, GetWindowText. Всегда следует проверять, что строка не пуста перед попыткой её прочитать.
Получение списка заголовков активных окон в операционной системе с использованием функций перечисления окон и фильтрации по определённым критериям.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS