Question:
How can I get a list of currently running applications and, more importantly, handles to their windows?
Answer:
For that you have to use the Windows API call, EnumWindows. This uses a user-defined callback function that performs some actions as each window is found. Below is some code that will load a list box of all window titles.
unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.DFM}function EnumWinProc(Wnd : HWND; frm : TForm1) : Boolean; Export; {$IFDEF Win32}StdCall;{$ENDIF}var WinText : Array[0..255] of Char;begin GetWindowText(Wnd, WinText, 255); Result := True; if (StrPas(WinText) <> '') then frm.ListBox1.Items.Add(StrPas(WinText));end;procedure TForm1.Button1Click(Sender: TObject);begin EnumWindows(@EnumWinProc, LongInt(Self));end;end.
Notice that the second parameter of EnumWindows passes the form’s handle to the EnumWinProc callback. This enables us to load the list box.
Also, the declaration for EnumWinProc has a compiler directive. For Win32, you need to include the stdcall directive. It’s not necessary for Win16.