Una forma de hacerlo es utilizando la API de Windows. Ojo! que no siempre puede funcionar en WinXP*
El truco es tratar de imitar el comportamiento de UAC en windows Vista y posteriores. En sí, en lo que consiste es en crear un nuevo escritorio con
CreateDesktop. Luego utiliza las funciones
SwitchDesktop y
SetThreadDesktop para mostrar el formulario en el nuevo escritorio, en el que el usuario no tendrá ningún tipo de interacción más que la ventana que proporcione tu aplicación.
Sin embargo, no es tan sencillo.
SetThreadDesktop no puede ejecutarse cuando el hilo principal de tu aplicación ya tiene una ventana o un "hook" instalado sobre otro escritorio. Se sabe que el objeto
Application de Delphi crea una ventana oculta siempre que inicias tu aplicación. Esta ventana oculta siempre impedirá que puedas llamar a la función
SetThreadDesktop.
Pero como todo en la vida este problema tiene solución. Lo único malo es que tendrás que técnicamente cerrar la aplicación y volverla a iniciar. Fíjate en este código que he escrito:
Código Delphi
[-]program Project1;
uses
Forms,
Windows,
Unit2 in 'Unit1.pas' ,
{$R *.res}
var
OldDesk: HDESK;
NewDesk: HDESK;
begin
Application.Run;
Application.Free;
OldDesk := GetThreadDesktop(GetCurrentThreadId);
NewDesk := CreateDesktop('my_desktop', nil, nil, 0, GENERIC_ALL, nil);
SwitchDesktop(NewDesk);
SetThreadDesktop(NewDesk);
Application := TApplication.Create(nil);
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Form2.ShowModal;
SwitchDesktop(OldDesk);
CloseDesktop(NewDesk);
end.
Este es el código fuente del inicio de la aplicación. El código que está en el archivo
*.dpr.
Esta es la solución más simple. Pero puede ser que en tu caso no sea realmente la más simple.
Hay otra técnica. Consiste en crear un nuevo proceso de tu aplicación desde la primera. Puedes consultar más al respecto en el blog oficial de JWSCL en
http://blog.delphi-jedi.net/2008/03/...threaddesktop/
Espero haber podido ayudarte.
Saludos!
PD.: Para simular que el escritorio siempre es el mismo, y el nuevo escritorio aparezca con los iconos a cómo lo hace UAC, tendrás que tomar una imagen del escritorio activo y dibujarla sobre el nuevo. En el enlace abajo hay código de ejemplo sobre cómo puedes hacer esto. Está en .net pero no es díficil de pasar a Delphi ya que el código original utiliza la API nativa de Windows (la misma utilizada por Delphi
).
--
*
http://blog.developex.com/?p=930