Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.02.2011, 00:08
Feodor Feodor вне форума
Прохожий
 
Регистрация: 19.01.2011
Сообщения: 24
Репутация: 10
По умолчанию Помогите Перечисление всех окон

Суть программы очень простая - вывести в TreeView все окна + их дочерние окна сохраняя всю структуру. Мой вариант выводит многое, но говорят это не все окна. И под окном Delphi нет окон Object Inspector и т.д
Думаю ошибка в GetWindow(Handle,gw_child) - она не возвращает по хэндлу Delphi его дочерние окна, хотя по хэндлу Object Inspector - Delphi является родителем (GetParent(Handle)). Может есть другой способ получать дочернее окно? (GetTopWindow, EnumChildWindows - почему-то тоже не срабатывают так как требуется).
P.S.: Добавил во вложения zip со своей прогой.

Мой код:
Код:
procedure Detka(H:hWnd;Tree:TTreeView; N:TTreeNode);{Хэндл окна с которого начинаем поиск, TreeView, Node родитель}
var
  buff:ARRAY [0..255] OF Char;{ для хранения заголовков окон}
  PNode:TTreeNode;{Node для TreeView}
begin
While H<>0 do   { пока успешно возвращается следующее окно}
  begin
        GetWindowText(H,buff,256); {получаем текст окна}
        PNode:=Tree.Items.AddChild(N ,buff);{записываем и запоминаем Node}
             Detka(GetTopWindow(H),Tree,PNode);{вызываем поиск дочернего, передаем Node родителя}
        H:= GetWindow(H, gw_hWndNext); {получаем следующее окно}
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TreeView1.Items.Clear; {очищаем TreeView перед добавлением}
  {хэндл первого окна на Z-уровне родителя нашего окна}
  Detka(GetWindow (GetWindow(Handle, gw_Owner), GW_HWNDFIRST) ,TreeView1,nil);{вызываем процедуру, передаем хэндл, TreeView, Node родитель}
end;

lmikle: пользуемся тегами!!!
Вложения
Тип файла: zip WINDOW.zip (10.8 Кбайт, 24 просмотров)
Ответить с цитированием
  #2  
Старый 17.02.2011, 00:24
Feodor Feodor вне форума
Прохожий
 
Регистрация: 19.01.2011
Сообщения: 24
Репутация: 10
По умолчанию Решил проблему...

Работает без использования GetWindow(Handle,gw_child).
Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    TreeView1: TTreeView;
    Button1: TButton;
    Panel2: TPanel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 {запись для сортировки в TreeView}
WindRec=record
  Text:string;
  Handle:hWnd;
end;
  {запись для работы с TreeView}
TreeRec=record
  Handle:HWND;
  Node:TTreeNode;
end;

  procedure GetOkna(H:hWnd);
  procedure Sort;
  procedure Chld(PH:hWnd;PNode:TTreeNode);
var
  Form1: TForm1;
  Wind:Array of WindRec;
  Tree:Array of TreeRec;
implementation
{$R *.dfm}
{заполнение массива}
procedure GetOkna(H:hWnd);
var
  buff:ARRAY [0..255] OF Char;
begin
While H<>0 do
  begin
        GetWindowText(H,buff,256);
          SetLength(Wind,Length(Wind)+1);
          Wind[Length(Wind)-1].Text:=buff;
          Wind[Length(Wind)-1].Handle:=H;
             GetOkna(GetTopWindow(H));
        H:= GetWindow(H, gw_hWndNext);
  end;
end;

{только для вывода дочерних окон}
procedure Chld(PH:hWnd;PNode:TTreeNode);
var
  i:Integer;
  PHc:HWND;
  PNodeC:TTreeNode;
begin
  for i:=0 to Length(Wind)-1 do
  begin
    IF  ( GetParent (Wind[i].Handle)<>0 ) AND (GetParent (Wind[i].Handle) = PH) THEN
    begin
      PnodeC:=Form1.TreeView1.Items.AddChild(PNode,Wind[i].Text);
      PHc:=Wind[i].Handle;
          {записываем Node для работы с TreeView}
          SetLength(Tree,Length(Tree)+1);
          Tree[Length(Tree)-1].Handle:=PH;
          Tree[Length(Tree)-1].Node:=PNode;
      Wind[i].Handle:=0;
       Chld(PHc,PNodeC);
    end;
  end;
end;

{только для не имеющих родителя}
procedure Sort;
var
  I:Integer;
  PNode:TTreeNode;
  PH:hWnd;
begin
  for i:=0 to Length(Wind)-1 do
  begin
   IF (Wind[i].Handle<>0) AND(GetParent(Wind[i].Handle)=0) Then
   begin
     PNode:=Form1.TreeView1.Items.Add(nil,Wind[i].Text);
     PH:=Wind[i].Handle;
        {записываем Node для работы с TreeView}
       SetLength(Tree,Length(Tree)+1);
       Tree[Length(Tree)-1].Handle:=PH;
       Tree[Length(Tree)-1].Node:=PNode;
     Wind[i].Handle :=0;
        Chld(PH,PNode);
   end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TreeView1.Items.Clear; {очищаем TreeView перед добавлением}
  SetLength(Tree,0);
  SetLength(Wind,0);

  {хэндл первого окна на Z-уровне родителя нашего окна}
  GetOkna( GetWindow (GetWindow(Handle, gw_Owner), GW_HWNDFIRST) );
  Sort;
end;



end.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:51.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter