Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

Browse for ALL instances of an application

Posted on 2001-07-24
16
164 Views
Last Modified: 2010-04-06
Hi all,
I want to know how can browse and find all instances of an application. For example: I want to find and maximize ALL windows that contains the string 'MyAppWindow'. Please include some code examples.

Thanks for your help in advance!
Best Regards
0
Comment
Question by:neshkov
  • 5
  • 4
  • 4
  • +1
16 Comments
 
LVL 27

Expert Comment

by:kretzschmar
ID: 6311389
look at enumwindows in winAPI
0
 

Author Comment

by:neshkov
ID: 6311406
Example please!
0
 
LVL 9

Accepted Solution

by:
ITugay earned 200 total points
ID: 6311435
Hi neshkov,

here is it:

procedure NextWindow(H,V:Integer); stdcall;
var
  C: array[0..255] of char;
begin
  GetClassName(H, C, 255);

  if C = 'TForm1' then
    ShowWindow(H, SW_MINIMIZE);
  EnumChildWindows(H, @NextWindow, V);
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  EnumWindows(@NextWindow, 0);
end;

-----
Igor.
0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
LVL 27

Expert Comment

by:kretzschmar
ID: 6311444
found an old sample in my paq (from january 1999)

--- paste begin
here is a little unit which collects windows and childwindows (handle, Caption ControlClass) and displayed
it in a treeview, not ready, not perfect, of course but it shows a way

unit fw_tree_u;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls, Grids, ComCtrls;

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   Button1: TButton;
   TV1: TTreeView;
   Splitter1: TSplitter;
   Panel2: TPanel;
   EClass: TEdit;
   EText: TEdit;
   EHandle: TEdit;
   Label1: TLabel;
   Label2: TLabel;
   Label3: TLabel;
   Button2: TButton;
   Button3: TButton;
   procedure Button1Click(Sender: TObject);
   procedure TV1Click(Sender: TObject);
   procedure TV1Change(Sender: TObject; Node: TTreeNode);
   procedure Button2Click(Sender: TObject);
 private
   { Private-Deklarationen }
 public
   { Public-Deklarationen }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

type
TTextBuf = array[0..100] of Char;
TTNData = Record
            ClassName : String[100];
            Caption   : String[100];
            Handle    : LongInt;
          end;

var
TNDPtr : ^TTNData;
TextBuf: TTextBuf;
TextBufPtr: PChar = TextBuf;
ActNode : TTreeNode;

Function MyClassName(CHandle : THandle) : String;
begin
 GetClassName(CHandle,TextBufPtr,100);
 Result := strpas(TextBufPtr);
end;

Function ControlCaption(CHandle : THandle) : String;
begin
 Getwindowtext(CHandle,TextBufPtr,100);
 Result := strpas(TextBufPtr);
end;

Procedure FindChilds(Depth : Integer; ParentW: THandle; Node : TTreeNode);
var
 ch1: THandle;
 s : String;
 i : Integer;
 TActNode : TTreeNode;
begin
 s := '';
 for i := 0 to depth do s := s + ':-';
 ch1 := GetWindow(ParentW, GW_Child);
 while not(ch1=0) do
 begin
   New(TNDPTr);
   TNDPtr^.ClassName := MyClassName(ch1);
   TNDPtr^.Caption := ControlCaption(ch1);
   TNDPtr^.Handle := ch1;
   TActNode := Form1.TV1.Items.AddChildObject(Node,TNDPtr^.ClassName,TNDPtr);
   ch1 := GetNextWindow(ch1, GW_HWNDNEXT);
 end;
 ch1 := GetWindow(ParentW, GW_Child);
 while not(ch1=0) do
 begin
   if GetWindow(ch1, GW_Child)<>0 then FindChilds(depth + 1,ch1,TactNode);
   ch1 := GetNextWindow(ch1, GW_HWNDNEXT);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 SHandle,
 FHandle : THandle;
begin
 SHandle := GetActiveWindow;
 while (SHandle <> 0) do
 begin
   SHandle :=  GetWindow(SHandle,GW_HWNDNEXT);  {Looking Foward the Z-Order}
   if SHandle <> 0 then
   begin
     New(TNDPTr);
     TNDPtr^.ClassName := MyClassName(SHandle);
     TNDPtr^.Caption := ControlCaption(SHandle);
     TNDPtr^.Handle := SHandle;
     ActNode := TV1.Items.AddChildObject(TV1.TopItem,TNDPtr^.ClassName,TNDPtr);
     FindChilds(0,SHandle,ActNode);
   end;
 end;
 SHandle := GetActiveWindow;
 while (SHandle <> 0) do
 begin
   SHandle := GetWindow(SHandle,GW_HWNDPREV); {Looking Backward the Z-Order}
   if SHandle <> 0 then
   begin
     New(TNDPTr);
     TNDPtr^.ClassName := MyClassName(SHandle);
     TNDPtr^.Caption := ControlCaption(SHandle);
     TNDPtr^.Handle := SHandle;
     ActNode := TV1.Items.AddChildObject(TV1.TopItem,TNDPtr^.ClassName,TNDPtr);
     FindChilds(0,SHandle,ActNode);
   end;
 end;
end;


procedure TForm1.TV1Click(Sender: TObject);
begin
 If TV1.Selected = TV1.TopItem then
 begin
   EClass.Text := '';
   EText.Text := '';
   EHandle.Text := '0';
 end
 else
 begin
   if TV1.Selected <> nil then
   begin
     TNDPtr := TV1.Selected.Data;
     EClass.Text := TNDPtr^.ClassName;
     EText.Text := TNDPtr^.Caption;
     EHandle.Text := inttostr(TNDPtr^.Handle);
   end
   else
   begin
     EClass.Text := '';
     EText.Text := '';
     EHandle.Text := '0';
   end;
 end;
end;

procedure TForm1.TV1Change(Sender: TObject; Node: TTreeNode);
begin
 TV1Click(self);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 showwindow(strtoint(ehandle.text),SW_SHOW);
end;

end.


meikl

--- paste end

matches not your needs, but may give a suggestion how to do it

meikl ;-)

hi, igor :-)

meikl ;-)
0
 
LVL 9

Expert Comment

by:ITugay
ID: 6311459
meikl :-)
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 6311476
hmm,
my sample doesn't use enumwindows,
it uses another alternative way,
maybe i should dig again in my paq

meikl ;-)
0
 
LVL 9

Expert Comment

by:ITugay
ID: 6311493
meikl,
yes, it's look like big enought :-)
-----
Igor.
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 6311585
hopefully madshi isn't angry about me
its unit at

www.madshi.net/enumStuff.zip

makes all easier

meikl ;-)
0
 
LVL 20

Expert Comment

by:Madshi
ID: 6311760
Why should I be angry? It's always nice to be referenced by other experts...   :-)

Igor, your NextWindow function needs to have a "bool" result, which has to be set to true. Otherwise the enumeration may stop, depending on random.

meikl, the documentation about EnumWindows sais this: "This function is more reliable than calling the GetWindow function in a loop. An application that calls GetWindow to perform this task risks being caught in an infinite loop or referencing a handle to a window that has been destroyed.". So we should really better use EnumWindows.

Regards, Madshi.
0
 

Author Comment

by:neshkov
ID: 6311787
Thank you Madshi!
OK, Igor, can you please rewrite your example?
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 6311802
:-) i know, madshi, just got the wrong sample from my paq
0
 
LVL 20

Expert Comment

by:Madshi
ID: 6311810
:-)
0
 

Author Comment

by:neshkov
ID: 6316326
Thank you gays!
0
 
LVL 9

Expert Comment

by:ITugay
ID: 6316553
Ok,
here is it.

function NextWindow(H,V:Integer): Boolean; stdcall;
var
 C: array[0..255] of char;
begin
 GetClassName(H, C, 255);

 if C = 'TForm1' then
   ShowWindow(H, SW_MINIMIZE);
 EnumChildWindows(H, @NextWindow, V);
 Result := true;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
 EnumWindows(@NextWindow, 0);
end;


Thanx for the points.
0
 
LVL 20

Expert Comment

by:Madshi
ID: 6316588
Ehmm... "Boolean" is 1 byte long. In fact it has to be "BOOL", which is 4 byte long. Well, it doesn't really matter much, because the result is returned in the register EAX, which is already 4 bytes long, but, hey, I'm a perfectionist...   :-)

Regards, Madshi.
0
 

Author Comment

by:neshkov
ID: 6316650
Hey Madshi, are you a german? ;)
...Best Regards
0

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
Two types of users will appreciate AOMEI Backupper Pro: 1 - Those with PCIe drives (and haven't found cloning software that works on them). 2 - Those who want a fast clone of their boot drive (no re-boots needed) and it can clone your drive wh…
Established in 1997, Technology Architects has become one of the most reputable technology solutions companies in the country. TA have been providing businesses with cost effective state-of-the-art solutions and unparalleled service that is designed…

809 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question