Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #8  
Antiguo 14-02-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 21
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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Pasar todas mis funciones y procedures a una unidad ...como...? Kenobi Varios 2 03-10-2008 17:03:35
Cambiar propiedad de componente del formulario padre al cerrar el formulario hijo jzginez OOP 5 22-06-2007 21:40:51
...Todas són iguales... FunBit Humor 2 29-12-2005 15:51:45
pasar datos de un formulario vista a cualquier formulario @-Soft OOP 2 28-09-2004 21:56:01
En Red Con Dbf ¿ Dudas? Todas mainau MySQL 7 21-04-2004 02:24:13


La franja horaria es GMT +2. Ahora son las 20:29:16.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi