[DUG] Getting command lines of all open programs

Conor Boyd Conor.Boyd at trimble.co.nz
Fri Feb 13 08:20:02 NZDT 2009


John,

Rather than enumerating windows, for this I think you'll want to
enumerate processes instead.

With a quick google for "enumerate windows processes" I found some leads
you could pursue (including this one:
http://www.codeproject.com/KB/threads/enumprocnt5.aspx)

It's definitely relatively easy to get a list of running process ids
(PIDs), and after that I presume there will be some function you can
call to tell you all you need to know about a specific process.

I presume what you want to do is possible since, for example,
Sysinternals' Process Explorer displays the commandline for each
process.

Cheers,

Conor

-----Original Message-----
From: delphi-bounces at delphi.org.nz [mailto:delphi-bounces at delphi.org.nz]
On Behalf Of John Bird

Is there a way to make a list of command lines of all open program
windows?

I have a utility that already captures the title bar of all open program
windows - I use it when I suspend my laptop in case Windows won't resume
(which it often doesn't) so I can know what windows were open.

The next neat addition would be to have the command lines, so I can then
have an option to reopen the programs that were open last time....now
that would be neat eh?

I remember seeing once a Delphi demo example of a task-manager like
program which probably had stuff like this, but haven't been able to
find it...

FYI here is the essentials of how I find the open program windows, in
case someone can see how to extend it a little....the ideal would be to
make a second string list of the matching command lines.  (It gets the
titles of all open windows and writes them into a memo and a disk file).

//http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_
21550337.html
procedure TfrmATMore.ATMakeWindowList;
var
 TopWindow   : HWND;
 WinName     : array[0..Max_Path] of Char;
 x           : Integer;

  function GetAllWindows(Handle: HWND; NotUsed: Pointer): Boolean;
stdcall;
  var
   temp,
   pt     : hwnd;
  begin
    Result := True;

    //Get parent of the window
    Temp:=Handle;
    repeat
     pt:=Temp;
     Temp:=GetParent( Temp );
    until (Temp=0);

    if IsWindowVisible(pt) then begin
      //Just add without duplicates
      if frmATMore.WindowList1.IndexOf(Pointer(pt))=-1 then
frmATMore.WindowList1.Add(Pointer(pt));
    end;
  end;

begin
  TopWindow   := Handle;
  WindowList1 := TList.Create;
  Memo1.Lines.Clear;
  memo1.Lines.Add(xfAdate+spc+xfaTime+' Windows open are:');

  try
    If NOT EnumWindows(@GetAllWindows,Longint(@TopWindow)) then
RaiseLastOsError;

    for x := 0 to WindowList1.Count - 1 do
    begin

      GetWindowText(HWND(WindowList1[x]),
                    WinName,
                    SizeOf(WinName) - 1);

      if WinName<>'' then memo1.Lines.add(WinName);
    end;
  finally
    WindowList1.Free;
  end;
  memo1.Lines.add('______________________');

 ......
  memo1.lines.SaveToFile(ATSaveWindowsNamesFile);
end;



More information about the Delphi mailing list