Creo que lo tengo.
En el fondo, lo que tú quieres saber es el z-order de las ventanas actualmente mostradas. El z-order es el orden en el que están "apiladas" las ventanas en la pantalla. Siendo la que está "arriba de todo" la ventana con el z-order cero y así en orden creciente hasta la última.
La API de Windows tiene dos funciones para saber el z-order de las ventanas, por el momento pude determinar el z-order de todas las ventanas abiertas (la de la aplicación actual y las del resto de las aplicaciones) usando estas dos funciones:
GetTopWindow() devuelve el handle de la ventana con z-order cero si le pasas cero como parámetro:
Código Delphi
[-]
var
h: hwnd;
begin
h:=GetTopWindow(0);
...
Luego:
GetNextWindow() devuelve la siguiente ventana según su z-order del handle que le pasas como parámetro, el segundo parmámetro sirve para indicarle la dirección en la que quieres recorrer el z-order:
Código Delphi
[-]
var
h: hwnd;
begin
h:=GetTopWindow(0);
while h <> 0 do
begin
h := GetNextWindow(h,GW_HWNDNEXT);
end;
Lo que hago aquí es obtener el handle de la ventana "arriba de todo" y luego entro al ciclo en el que recorro todas las ventanas hasta abajo de la pila de ventanas. La última ventana no tiene una ventana siguiente y la función GetNextWindow devuelve cero, con lo que finaliza el ciclo.
Código Delphi
[-]
var
h: hwnd;
z: integer;
begin
Memo1.Lines.Clear;
h:=GetTopWindow(0);
z:=0;
while h <> 0 do
begin
if h = Form1.Handle then
Memo1.Lines.Add(IntToStr(z)+' Es el form1.');
if h = Form2.Handle then
Memo1.Lines.Add(IntToStr(z)+' Es el form2.');
if h = Form3.Handle then
Memo1.Lines.Add(IntToStr(z)+' Es el form3.');
h := GetNextWindow(h,GW_HWNDNEXT);
inc(z);
end;
end;
Este sería el código con el que podrías comenzar a experimentar. La variable z te dirá el z-order de las ventanas.