Ver Mensaje Individual
  #19  
Antiguo 25-02-2008
Avatar de German
German German is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 133
Reputación: 21
German Va por buen camino
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);

  { Si ya existe , ponemos el mutex a cero }
  if GetLastError = ERROR_ALREADY_EXISTS then Mutex := 0
  else begin
    { Si no existe, sustituimos el procedimiento de ventana }
    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.
__________________
Tengo las manos llenas de dedos... Tengo los dedos llenos de teclas...
Tengo las teclas desordenadas... Tengo el desorden muy controlado...
Tengo el control en mis manos.

Última edición por German fecha: 25-02-2008 a las 06:06:22.
Responder Con Cita