//声明:
GetWindow(
  hWnd: HWND; {指定的窗口句柄}
  uCmd: UINT  {指定的关系选项}
): HWND;      {失败返回0; 成功返回符合的窗口句柄}
//uCmd 可选值:
GW_HWNDFIRST = 0; {同级别 Z 序最上}
GW_HWNDLAST  = 1; {同级别 Z 序最下}
GW_HWNDNEXT  = 2; {同级别 Z 序之下}
GW_HWNDPREV  = 3; {同级别 Z 序之上}
GW_OWNER     = 4; {属主窗口}
GW_CHILD     = 5; {子窗口中的最上}

枚举当前所有窗口
回复 maxcool 的问题:

 
  
{要有个 Memo 接受数据}
procedure TForm1.Button1Click(Sender: TObject);
var
  h: HWnd;
  p: array[0..254] of char;
begin
  h := GetWindow(Handle, GW_HWNDFIRST);
  while h <> 0 do
  begin
    if GetWindowText(h, p, 255) > 0 then Memo1.Lines.Add(p);
    h := GetWindow(h, GW_HWNDNEXT);
  end;
end;
WinAPI: GetTopWindow - 获取指定窗口的子窗口中最顶层的窗口句柄
 
  
//声明:
GetTopWindow(
  hWnd: HWND; {指定的窗口句柄}
): HWND;      {失败返回0; 成功返回最顶层的子窗口句柄}
这和用 GetWindow 函数使用 GW_CHILD 参数时应该是一样的, 测试一下:

 
  
var
  h1,h2: HWND;
begin
  h1 := GetTopWindow(GetDesktopWindow);
  h2 := GetWindow(GetDesktopWindow, GW_CHILD);
  ShowMessage(Format('%d,%d',[h1,h2])); {132540,132540}
end;
WinAPI: GetNextWindow - 获取指定窗口Z上或Z下的窗口的句柄
 
  
//声明:
GetNextWindow(
  hWnd: HWND; {指定的窗口句柄}
  uCmd: UINT  {指定的关系选项}
): HWND;      {失败返回0; 成功返回符合的窗口句柄}
//uCmd 可选值:
GW_HWNDNEXT  = 2; {同级别 Z 序之下}
GW_HWNDPREV  = 3; {同级别 Z 序之上}