Por "actualizar" un poco el hilo, hago un pequeño comentario, después de utilizar la unidad UIApp en D2007, y bajo Vista 64...
La función
IsIconic(Handle) siempre devuelve False, y
ShowWindow(Handle, SW_RESTORE) no restaura la aplicación. Debería utilizarse:
Código Delphi
[-]if IsIconic(Application.MainForm.Handle) then ShowWindow( Application.MainForm.Handle, SW_RESTORE)
Además, en el proc. "Registrar", la excepción silenciosa utilizada cuando ya existe el mutex, siempre es lanzada (o sea que se convierte en escandalosa), apareciendo el mensaje de diálogo, con lo que el try de initialization deja de tener sentido. Se podría solucionar de este manera...
Código Delphi
[-]
(...)
procedure Registrar;
begin
mActivar := RegisterWindowMessage(sActivar);
Mutex := CreateMutex(nil, true, sMutex);
if GetLastError = ERROR_ALREADY_EXISTS then Mutex := 0
else begin
PrevWndProc := TFarProc(GetWindowLong(Application.Handle, GWL_WNDPROC));
SetWindowLong(Application.Handle, GWL_WNDPROC, LongWord(@AppWndProc));
end;
end;
initialization
Registrar;
if Mutex = 0 then
begin
Activar;
Halt;
end;
(...)
El ejecutable resultante funciona tanto en XP como en Vista de forma correcta.
Salu2.