Ver Mensaje Individual
  #3  
Antiguo 09-02-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Aquí te va la idea más desarrollada.

Para el ejemplo uso dos aplicaciones: MainApp y LockApp

MainApp se ejecuta normalmente en el escritorio por defecto y al oprimir un botón manda ejecutar la otra en un escritorio alterno. Esta otra aplicación es un simple cuadro de usuario-contraseña. Al oprimir su botón "Ok" se cierra y regresa al escritorio usual.

Para que tengas claro el concepto te puedes bajar el ejemplo de mi página:

DesktopsSrc.zip (14.2kb)
DesktopsExe.zip (398 kb)

El primer zip contiene el código fuente de ambas aplicaciones y el segundo son los ejecutables ya compilados.

Pon ambos ejecutables en la misma carpeta. La aplicación LockApp es sólo una simulación así que no requieres poner ninguna contraseña ni usuario.

Por cualquier cosa cierra todas tus aplicaciones antes de ejecutar MainApp, no vaya a ser que debas reiniciar Windows

La aplicación MainApp crea el escritorio alterno en el evento OnCreate:

Código Delphi [-]
procedure TMainForm.FormCreate(Sender: TObject);
begin
  LockDesktop := CreateDesktop(
    'LockDesktop', nil, nil, 0,
    DESKTOP_CREATEWINDOW or DESKTOP_SWITCHDESKTOP, nil);
end;

donde LockDesktop es una variable privada de tipo HDesk y 'LockDesktop' es el nombre que le damos al escritorio alterno.

El escritorio se destruye en el evento OnDestroy del formulario:

Código Delphi [-]
procedure TMainForm.FormDestroy(Sender: TObject);
begin
  CloseDesktop(LockDesktop);
end;

En el evento OnClick del botón btnLock es donde se hace el cambio al escritorio alterno:

Código Delphi [-]
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;

begin
  FillChar(StartInfo, SizeOf(StartInfo), 0);
  StartInfo.cb := SizeOf(StartInfo);
  StartInfo.lpDesktop := PChar('LockDesktop');
  CreateProcess('LockApp.exe', nil, nil, nil, false, 0, nil, nil, StartInfo, ProcInfo);

  SwitchDesktop(LockDesktop);
end;

Aquí se usa CreateProcess en lugar de algo más sencillo como WinExec para poder especificar en qué escritorio deseamos ejecutar la aplicación.

SwitchDesktop simplemente conmuta al escritorio alterno. Al hacer esto verás un escritorio vacío con una única ventana: la de LockApp.

Esta aplicación es la que debe validar el usuario y contraseña y en su caso conmutar de vuelta al escritorio por defecto:

Código Delphi [-]
var
  DefaultDesktop: HDesk;

begin
  // Cerramos LockApp
  Close;

  // Obtenemos un 'handle' al escritorio por defecto
  DefaultDesktop := OpenDesktop(
    'Default', 0, true, DESKTOP_SWITCHDESKTOP);

  // conmutamos al escritorio por defecto
  SwitchDesktop(DefaultDesktop);
end;

Y listo, eso es básicamente todo lo que hay que hacer.

Mientras el escritorio alterno esté visible el usuario no podrá hacer nada que no sea interactuar con el cuadro de usuario-contraseña.

Otras ventanas, como las que mencionas del Messenger, seguirán abriéndose pero no se verán ni se podrá hacer nada con ellas hasta que no se regrese al escritorio normal.

Ya en la aplicación real hay que cuidar algunos detalles: por ejemplo, impedir que la aplicación LockApp pueda cerrarse con Alt-F4 o cualquier método que no sea a través de la validación de los datos. Esto lo puedes hacer con el evento OnCloseQuery pero para ser más finos tendrás que manejar el mensaje WM_QUERYENDSESSION y dar una opción en LockApp para poder cerrar la sesión de Windows sin necesidad de regresar al escritorio normal pero esto es harina de otro costal...

// Saludos

Última edición por roman fecha: 06-09-2006 a las 04:57:53.
Responder Con Cita