Yo había creado unas funciones mas genéricas, tu "GetMainWindow" es algo así:
Código Delphi
[-]
function FindThreadWindow(dwThreadId: DWORD; hParent: HWND; lpClassName, lpWindowName: PAnsiChar; wTimeOut: Word = 30000): HWND;
var
AFindWindow: TFindWindow;
ATickCount: DWORD;
begin
AFindWindow.lpClassName := lpClassName;
AFindWindow.lpWindowName := lpWindowName;
AFindWindow.hResult := 0;
ATickCount := GetTickCount + wTimeOut;
repeat
if hParent = 0 Then
EnumThreadWindows(dwThreadId, @EnumThreadWndProc, Integer(@AFindWindow))
else
EnumChildWindows(hParent, @EnumThreadWndProc, Integer(@AFindWindow));
until (AFindWindow.hResult <> 0) or (ATickCount < GetTickCount);
Result := AFindWindow.hResult;
end;
Me parece que es un poco mas real el concepto de TimeOut, en tu código es un tiempo de espera. (Solo una cuestión semántica
)
Vale aclarar que usar GetTickCount no es del todo seguro para estos casos, ya que si el equipo estuvo encendido durante 49.7 días, este vuelve a cero. Un poco extraño, pero en uno de los proyectos en que estoy trabajando ha sucedido
.