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
Close;
DefaultDesktop := OpenDesktop(
'Default', 0, true, DESKTOP_SWITCHDESKTOP);
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