Ver Mensaje Individual
  #8  
Antiguo 14-02-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Reputación: 18
Chris Va por buen camino
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' {Form1},

{$R *.res}

var
    OldDesk: HDESK;
    NewDesk: HDESK;
begin
    // cerramos instancia anterior de la aplicación.
    // la que Delphi crea predetermindadmente
    Application.Run;
    Application.Free;

    // creamos un nuevo escritorio y nos mudamos a él
    OldDesk := GetThreadDesktop(GetCurrentThreadId);
    NewDesk := CreateDesktop('my_desktop', nil, nil, 0, GENERIC_ALL, nil);
    SwitchDesktop(NewDesk);
    SetThreadDesktop(NewDesk);

    // creamos nuevamente una instancia de la aplicación
    // la nueva instancia se creará sobre el nuevo escritorio
    Application := TApplication.Create(nil);
    Application.Initialize;

    Application.CreateForm(TForm1, Form1);
    Form2.ShowModal;

    // estas dos últimas líneas son muy importantes,
    // sino son llamadas quedarás enjaulado en un
    // escritorio que no da ninguna interacción.
    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
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita