Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получение списка запущенных оконных приложений на Windows с помощью Delphi

Delphi , ОС и Железо , Windows

В данной статье мы рассмотрим, как получить список запущенных оконных приложений на Windows с помощью языка программирования Delphi. Для этого мы будем использовать API-функции Windows, а именно EnumWindows и GetWindowText.

Введение

При разработке приложений на Delphi иногда возникает необходимость получения списка запущенных оконных приложений на компьютере пользователя. Например, для реализации функции "Поделиться" вроде той, что есть в Discord. В этом случае нам нужно перечислить все запущенные приложения с графическим интерфейсом и предоставить пользователю возможность выбрать одно из них для отправки.

Решение с помощью EnumWindows и GetWindowText

Для получения списка запущенных оконных приложений можно воспользоваться функцией EnumWindows из библиотеки Winapi.Windows. эта функция позволяет перечислить все окна на экране и вызвать заданную процедуру для каждого из них. В нашем случае мы будем собирать информацию о каждом окне и добавлять ее в список.

Вот пример кода, который демонстрирует, как это можно сделать:

uses
  Winapi.Windows;

type
  TWindowInfo = record
    HWnd: HWnd;
    Caption: string;
  end;

function EnumWindowsProc(hWnd: HWnd; lParam: LongInt): LongBool; stdcall;
var
  WindowInfo: TWindowInfo;
begin
  WindowInfo.HWnd := hWnd;
  GetWindowText(hWnd, WindowInfo.Caption, 256);
  TArray<TWindowInfo>.Assign(lParam, [WindowInfo]);
  Result := True;
end;

function GetRunningWindows: TArray<TWindowInfo>;
var
  WindowInfos: TArray<TWindowInfo>;
begin
  EnumWindows(@EnumWindowsProc, LongInt(@WindowInfos));
  Result := WindowInfos;
end;

В данном примере мы определили тип TWindowInfo, который содержит информацию о каждом окне: дескриптор окна (HWnd) и его заголовок (Caption). Функция EnumWindowsProc вызывается для каждого окна и заполняет список WindowInfos информацией о текущем окне. finally, функция GetRunningWindows возвращает список всех окон, найденных с помощью EnumWindows.

Альтернативное решение с использованием WinAPI

Если вам нужно получить не только заголовок окна, но и другие сведения, такие как процесс, к которому оно принадлежит, или его размеры, можно воспользоваться другими функциями WinAPI, такими как GetWindowThreadProcessId, IsWindowVisible, GetWindowRect и т. д. В этом случае можно использовать следующий код:

uses
  Winapi.Windows,
  Winapi.Processes,
  Winapi.Messages;

type
  TWindowObject = record
    Handle: HWnd; // Window Handle
    Caption: String; // Window Caption Text (If any)
    ProcessID: DWORD; // Process the window belongs to
    IsVisible: Boolean; // Is the window visible?
    IsEnabled: Boolean; // Is the window enabled for mouse/keyboard input?
    IsIconic : Boolean; // Is the window minimized?
    Dimensions: TRect; // Window Dimensions
  end;

function WindowCallback(WHandle: HWnd; Parm: LPARAM): BOOL; stdcall;
var
  MyWindow: TWindowObject;
  MyString: String;
begin
  MyWindow.Handle := WHandle;
  SetLength(MyString, GetWindowTextLength(WHandle));
  SetLength(MyString, GetWindowText(WHandle, PChar(MyString), Length(MyString)+1));
  MyWindow.Caption := MyString;

  MyWindow.ProcessID := 0;
  GetWindowThreadProcessId(WHandle, @MyWindow.ProcessID);

  MyWindow.IsVisible := IsWindowVisible(WHandle);

  MyWindow.IsEnabled := IsWindowEnabled(WHandle);

  MyWindow.IsIconic := IsIconic(WHandle);

  MyWindow.Dimensions := Rect(0,0,0,0);
  GetWindowRect(WHandle, MyWindow.Dimensions);

  var MyArray := PWindowObjectArray(Parm);

  SetLength(MyArray^, Length(MyArray^)+1);
  MyArray^[High(MyArray^)] := MyWindow;

  Result := True;
end;

function GetListOfRunningGUIApps: TArray<TWindowObject>;
var
  TempResult: TArray<TWindowObject>;
begin
  EnumWindows(@WindowCallback, LPARAM(@TempResult));
  Result := TempResult;
end;

В данном примере мы определили тип TWindowObject, который содержит более подробную информацию о каждом окне. Функция WindowCallback заполняет объект MyWindow данными о текущем окне и добавляет его в список TempResult. finally, функция GetListOfRunningGUIApps возвращает список всех окон, найденных с помощью EnumWindows.

Вывод

В данной статье мы рассмотрели, как получить список запущенных оконных приложений на Windows с помощью Delphi. Мы представили два решения: первое использует функции EnumWindows и GetWindowText, а второе использует другие функции WinAPI для получения более подробной информации о каждом окне. Выбор решения зависит от конкретных требований вашего проекта.

Создано по материалам из источника по ссылке.

В данной статье описывается, как получить список запущенных оконных приложений в Windows с помощью Delphi, используя функции EnumWindows и GetWindowText API Windows.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-28 09:25:59/0.0059828758239746/0