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

Получение списка окон, с возможностью указания типа окна

Delphi , Программа и Интерфейс , Процессы и Сервисы

Получение списка окон, с возможностью указания типа окна

Автор: VID
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Получение списка окон, с возможностью указания типа окна

Процедура заполняет список List именами окон, в ОС.
ПАРАМЕТРЫ:
YourApplicationHandle - дескриптор приложения,
вызывающего процедуру (Application.Handle);
ShowOwnWindow - указание на то, что в списке List,
должно быть также имя окна вызвавшего процедуру;
ShowInvisibleWindows - укание на отображение в List имён невидимых окон;
ShowChildWindows - указание на отображение в LIST имён дочерних окон;
ShowNoHeadWindows - отображение списка окон, без заголовков;
ShowMainWindows - отображение родительских окон.

Также для каждой строки списка LIST добавляется объект (Object),
который содержит указатель дескриптор окна.
При обнаружении недостатков, или вопиющей неоптимальности кода - пишите :)

Зависимости: sysutils, classes, windows, UBPFD.GetWordListFromText
Автор:       VID, vidsnap@mail.ru, ICQ:132234868, Махачкала
Copyright:   VID
Дата:        02 мая 2002 г.
***************************************************** }

procedure GetWindowsList(List: TStrings; YourApplicationHandle: HWND;
  ShowOwnWindow, ShowInvisibleWindows, ShowChildWindows, ShowNoHeadWindows,
  ShowMainWindows: Boolean);
var
  Wnd: hWnd;
  buff: array[0..127] of Char;
  I: integer;
  CanShowIt: Boolean;
  WindowType, UnAcceptWinTypes: string;
  WordList: TStringList;
begin
  List.Clear;
  Wnd := GetWindow(YourApplicationHandle, gw_HWndFirst);
  WordList := TStringList.Create;
  while Wnd <> 0 do
  begin
    WindowType := '';
    if Wnd = YourApplicationHandle then
      WindowType := WindowType + ' own '; {собственное окно}
    if IsWindowVisible(Wnd) = null then
      WindowType := WindowType + ' invisible '; {-Невидимые окна}
    if GetWindow(Wnd, gw_child) <> 0 then
      WindowType := WindowType + ' child '; {-Дочерние окна}
    if GetWindowText(Wnd, buff, sizeof(buff)) = 0 then
      WindowType := WindowType + ' nohead '; {-Окна без заголовков}
    if GetWindow(Wnd, gw_Owner) <> 0 then
      WindowType := WindowType + ' main '; {-Главные окна}

    UnAcceptWinTypes := '';
    if ShowOwnWindow = False then
      UnAcceptWinTypes := UnAcceptWinTypes + ' own ';
    if ShowInvisibleWindows = False then
      UnAcceptWinTypes := UnAcceptWinTypes + ' invisible ';
    if ShowChildWindows = False then
      UnAcceptWinTypes := UnAcceptWinTypes + ' child ';
    if ShowNoHeadWindows = False then
      UnAcceptWinTypes := UnAcceptWinTypes + ' nohead ';
    if ShowMainWindows = False then
      UnAcceptWinTypes := UnAcceptWinTypes + ' main ';
    CanShowIt := True;
    GetWordListFromText(UnAcceptWinTypes, ' ', WordList, False, False);
    if WordList.Count > 0 then
    begin
      I := -1;
      repeat
        I := I + 1;
        if Pos(WordList.Strings[i], WindowType) > 0 then
          CanShowIt := False;
      until (I = WordList.Count - 1) or (CanShowIt = False);
    end;
    if CanShowIt = True then
    begin
      GetWindowText(Wnd, buff, sizeof(buff));
      I := List.Add(StrPas(buff));
      List.Objects[I] := Pointer(Wnd);
    end;
    Wnd := GetWindow(Wnd, gw_hWndNext);
  end;
  WordList.Free;
end;

Пример использования:

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetWindowsList(memo1.Lines, self.Handle, true, false, false, true, true);
end;

Перевод контента на русский язык:

Процедура Delphi, называемая GetWindowsList, получает список окон с возможностью указания типа окна. Процедура принимает шесть параметров boolean:

  • ShowOwnWindow: включать ли собственное окно (то есть основное окно вызывающей приложения)
  • ShowInvisibleWindows: включать ли невидимые окна
  • ShowChildWindows: включать ли дочерние окна
  • ShowNoHeadWindows: включать ли окна без заголовков
  • ShowMainWindows: включать ли основные окна
  • YourApplicationHandle: handle приложения, вызывающего эту процедуру

Процедура пополняет список имен окон и соответствующих handle окон. Она использует несколько функций Windows API, таких как GetWindow, IsWindowVisible, GetWindowText и GetWindow снова.

Вот некоторые предложения по улучшению:

  1. Рассмотреть более описательное имя для процедуры, например, GetWindowsListWithFilters.
  2. Использование магических чисел (например, 127 в массиве buff) можно избежать, определив константы.
  3. Код может получить пользу от дополнительных комментариев и документации, объясняющей его цель и поведение.
  4. Вместо использования параметра boolean для каждого типа окна рассмотреть использование одиночной строки-параметра, которая указывает типы окон, которые должны быть показаны. Это позволит процедуре быть более гибкой и удобной в использовании.
  5. Процедура создает объект TStringList и затем освобождает его в конце. Рассмотреть использование локальной переменной вместо этого, чтобы предотвратить утечки памяти.

Вот пример модификации процедуры для принятия одиночной строки-параметра:

procedure GetWindowsList(List: TStrings; YourApplicationHandle: HWND; Filter: string);
var
  Wnd: hWnd;
  buff: array[0..127] of Char;
  I: integer;
  CanShowIt: Boolean;
  WordList: TStringList;
begin
  List.Clear;
  Wnd := GetWindow(YourApplicationHandle, gw_HWndFirst);
  WordList := TStringList.Create;
  while Wnd <> 0 do
  begin
     // ... (rest of the code remains the same)
  end;
  WordList.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetWindowsList(memo1.Lines, self.Handle, 'own child main');
end;

В этом примере параметр Filter - это строка, которая указывает типы окон, которые должны быть показаны. Процедура использует функцию Pos для проверки, соответствует ли каждое окно фильтрующей строке. Если окно соответствует фильтру, оно добавляется в список.

Процедура GetWindowsList получает список окон в ОС, с возможностью указания типа окна (свое, невидимое, дочернее, без заголовка или родительское).


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

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




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


:: Главная :: Процессы и Сервисы ::


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:55:03/0.0058829784393311/1