Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2019, 12:15   #1
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию Поиск окна Windows

Необходимо перебрать все окна Windows.
Нашёл такую функцию:
Код:
  type
  PNodeOptions=^NodeOptions;
 NodeOptions = TTreeNode;

function EnumWindowsProc(Wnd: HWND; ParentNode: TTreeNode): Bool; stdcall;
implementation
uses Easy;

function EnumWindowsProc(Wnd: HWND; ParentNode: TTreeNode): Bool; stdcall;
const
  ClassNameLen = 512;    // т.к. мы не знаем длину имени класса заранее, выделим достаточно места
var
  Text: string;                    // Заголовок окна
  TextLen: integer;           // Длина заголовка
  ClassName: array[0..ClassNameLen-1] of Char;    // буфер для имени класса
  Node: NodeOptions;
  NodeName: string;
begin
  Result:= true;
  // Будем искать только прямых потомков, остальные игнорируем
  if Assigned(ParentNode) and (GetParent(Wnd) <> HWND(ParentNode.Data)) then
    Exit;
  // Получаем длину заголовка окна
  TextLen:= SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);
  // Устанавливаем длину строковой переменной
  SetLength(Text, TextLen);
  if TextLen > 0 then
    SendMessage(Wnd, WM_GETTEXT, TextLen+1, LParam(Text));
  // Слишком длинные строки обрезаем
  if TextLen > 100 then
    Text:= Copy(Text, 1, 100) + '  ' ;
  GetClassName(Wnd, ClassName, ClassNameLen);
  ClassName[ClassNameLen-1]:= #0;
  if Text = '' then
    NodeName:= 'Без названия (' + ClassName + ')'
  else
    NodeName:= Text + ' (' + ClassName + ') ';
  Node:= FormRun.tv1.Items.AddChild(ParentNode, NodeName);
  Node.Text:=NodeName;
  FormRun.Memo1.Lines.Add(NodeName);
  Node.Data:= Pointer(Wnd);
  EnumChildWindows(Wnd, @EnumWindowsProc, LParam(Node));
end;
Всё работает, но хотелось бы обойтись без вывода в компонент дерева и на экран. Не могу сообразить - как обойтись.
Aleksandr_59 вне форума Ответить с цитированием
Старый 04.06.2019, 13:35   #2
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

Не совсем правильно высказался.
Если убрать вывод в компонент на форме (дерево),
Код:
Node:= FormRun.tv1.Items.AddChild(ParentNode, NodeName);
то не инициализируется переменная Node типа TTreeNode. И, соответственно, некорректно работает функция обратного вызова.
Aleksandr_59 вне форума Ответить с цитированием
Старый 04.06.2019, 13:48   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ну так избавьтесь от дерева и нод совсем, ваша функция хочет только хендл его и передаавайте и чуть условие поменяйте.
p51x вне форума Ответить с цитированием
Старый 04.06.2019, 14:09   #4
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
ваша функция хочет только хендл его и передаавайте и чуть условие поменяйте
Функция хочет
Код:
function EnumWindowsProc(Wnd: HWND; ParentNode: TTreeNode): Bool; stdcall;
И без TTreeNode не получается.
Aleksandr_59 вне форума Ответить с цитированием
Старый 04.06.2019, 14:14   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Функция хочет
Код:
BOOL CALLBACK EnumChildProc(
  _In_ HWND hwnd,
  _In_ LPARAM lParam
);
https://docs.microsoft.com/en-us/pre...633493(v=vs.85)
А то, что вы lParam используте для передачи TTreeNode - ваше право... и вы можете передавать только хендл ныжный этой функции фактически.
p51x вне форума Ответить с цитированием
Старый 04.06.2019, 14:15   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

попробуйте такой код (С) Отсюда - http://rsdn.org/forum/delphi/2046141.hot

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    buttonCreateListOfWindows: TButton;
    buttonSaveListToTextFile: TButton;
    procedure buttonCreateListOfWindowsClick(Sender: TObject);
    procedure buttonSaveListToTextFileClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  lst: TStringList;

implementation

{$R *.dfm}

//Просто добавить строку в список

procedure AddToList(s: string);
begin
  lst.Add(s);
end;


//Перечислить дочерние окна

function EnumChildProc(wdc: hwnd; Param: LongInt): boolean; stdcall;

var
  buf: array[0..250] of char;
  s: string;

begin
  GetWindowText(wdc, buf, sizeof(buf));
  s := StrPas(buf);
  if (s <> '') then
    AddToList(s);
  EnumChildProc := true;
end;

//Перечислить основные окна

function EnumProc(Wd: HWnd; Param: LongInt): Boolean; stdcall;
var
  buf: array[0..250] of char;
  s: string;

begin
  GetWindowText(wd, buf, sizeof(buf));
  s := StrPas(buf);
  if (s <> '') and (GetWindowLong(Wd, GWL_HWNDPARENT) = 0) then
  begin
    AddToList(s);
  end else
  begin
    EnumChildWindows(wd, @EnumChildProc, 0);
  end;
  EnumProc := true;
end;

//Основная процедура перечисления
procedure TForm1.buttonCreateListOfWindowsClick(Sender: TObject);
begin
  EnumWindows(@EnumProc, 0);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  lst := TStringList.Create;
end;

//Сохранить список в файл
procedure TForm1.buttonSaveListToTextFileClick(Sender: TObject);
begin
  lst.SaveToFile('windowlist.txt');
end;

end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.06.2019, 10:38   #7
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
и вы можете передавать только хендл ныжный этой функции фактически
Моей конкретной функции нужна переменная ParentNode: TTreeNode, а без неё не получается.
Aleksandr_59 вне форума Ответить с цитированием
Старый 05.06.2019, 10:53   #8
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

Serge_Bliznykov, спасибо.
Ваш пример - то, что требуется
Aleksandr_59 вне форума Ответить с цитированием
Старый 05.06.2019, 10:58   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Так поменяйте заголовок и чуть исправьте условие. Вы программируюете или марки на конверт наклеиваете?
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WINDOWS-окна на асме DinoAsm Win Api 7 21.03.2011 17:01
Фото окна windows Kaban4ig Мультимедиа в Delphi 4 11.03.2011 08:29
Окна как будто в Windows bookkc JavaScript, Ajax 3 16.08.2010 19:03
Закрытие окна windows niva622 Помощь студентам 3 11.04.2010 19:39
Окна в windows Женька Помощь студентам 3 18.06.2008 13:15