Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-02-2012
pape19 pape19 is offline
Miembro
 
Registrado: Jul 2010
Posts: 96
Poder: 8
pape19 Va por buen camino
Formulario que inhabilite todas las funciones

Saludos, mi consulta es la siguiente.

Mi aplicación, en cierto momento, abre un formulario con un cronómetro, el cual finaliza al apretar un gran botón.

Este formulario, no ocupa toda la pantalla, por lo que puede a sus costados verse el entorno común de Windows.

Lo que yo necesito, es deshabilitar todo, de manera que la unica opción para continuar con la funcionalidad de la aplicación y del propio entorno del sistema operativo sea presionar ese gran botón.

Ejemplo para expresarme mejor...se abre este formulario, y a los costados se ve parte del escritorio, incluyendo el ícono MiPC. Lo que quiero lograr es que si hago click sobre el ícono no pase nada, no hasta que yo aprete ese gran botón.

Espero haberme explicado bien, muchas gracias!

PD: La idea es que el formulario no ocupe toda la pantalla. Esta solución queda descartada.
Responder Con Cita
  #2  
Antiguo 14-02-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.172
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
¿Para qué quieres que se vea el escritorio si de todas maneras va a ser inaccesible?

// Saludos
Responder Con Cita
  #3  
Antiguo 14-02-2012
pape19 pape19 is offline
Miembro
 
Registrado: Jul 2010
Posts: 96
Poder: 8
pape19 Va por buen camino
Porque por cuestiones de diseño de la aplicación, no quiero que el formulario ocupe toda la pantalla. Pura cuestión estética.

Aunque si no hay solución a lo que pido, no me quedará otra alternativa.
Responder Con Cita
  #4  
Antiguo 14-02-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.172
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Una opción rudimentaria es la de abrir un formulario a pantalla completa pero con su propiedad AlphaBlend en true y AlphaBlendValue en 1. Tal formulario será transparente de manera que parecerá que no está, y, si embargo, no puedes seleccionar nada por debajo de él. Encima de este formulario abres el del cronómetro.

// Saludos
Responder Con Cita
  #5  
Antiguo 14-02-2012
pape19 pape19 is offline
Miembro
 
Registrado: Jul 2010
Posts: 96
Poder: 8
pape19 Va por buen camino
No conocía esa herramienta. Igualmente probé y el rendimiento es algo ineficiente.

Muchisimas gracias por tu ayuda! Sigo buscando, aunque lo más probable es que termine poniendo el form en Maximized.
Responder Con Cita
  #6  
Antiguo 14-02-2012
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: May 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 18
BlueSteel Va por buen camino
Hola...

yo tengo un form.. aunque si lo dejo en pantalla completa, pero además, en la propiedad

FormStyle := fsStayOnTop;

lo que me deja siempre la aplicación encima...

Salu2
__________________
BlueSteel
Responder Con Cita
  #7  
Antiguo 14-02-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.172
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Cita:
Empezado por pape19 Ver Mensaje
No conocía esa herramienta. Igualmente probé y el rendimiento es algo ineficiente.
¿En qué sentido es ineficiente?

// Saludos
Responder Con Cita
  #8  
Antiguo 14-02-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: Apr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.676
Poder: 13
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
  #9  
Antiguo 17-02-2012
Avatar de bosster_018
bosster_018 bosster_018 is offline
Miembro
 
Registrado: Nov 2009
Ubicación: Bolivia
Posts: 127
Poder: 9
bosster_018 Va por buen camino
Lightbulb Proceso Explorer.exe

En Windows Xp

Cuando yo hice una aplicación de mensaje al iniciar Windows Xp (Epocas de novatillo.... Aunque lo sigo siendo )

Para que el usuario no pueda hacer nada más que oprimir el Botón "Aceptar"

Yo cerraba el proceso "explorer.exe" y mediante un timer controlaba que no se vuelva a ejecutar.

De paso negaba los permisos de entrar al control de procesos (mediante el Ctrl+alt+spr) para que el usuario esté obligado a aceptar mi mensaje de bienvenida sin "cerrar mi programa"

Despues que el usuario oprimía el botón. La aplicación volvía a la normalidad todo el escritorio....



Puedes empezar por investigar como cerrar procesos de Windows.

Aunque al cerrar el explorar.exe, se cierran todas las ventanas abiertas....

Por lo que tal vez no te sirva
Responder Con Cita
  #10  
Antiguo 08-03-2018
OmarEnrique OmarEnrique is offline
Registrado
 
Registrado: Mar 2018
Posts: 1
Poder: 0
OmarEnrique Va por buen camino
soy nuevo en el club
He probado el truco al que hacen mención y funciona correctamente...
Pero necesito saber cómo regresar el escritorio por defecto de Windows al hacer clic en un botón determinado de mi aplicación.
Responder Con Cita
  #11  
Antiguo 08-03-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.245
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por OmarEnrique Ver Mensaje
soy nuevo en el club
He probado el truco al que hacen mención y funciona correctamente...
Pero necesito saber cómo regresar el escritorio por defecto de Windows al hacer clic en un botón determinado de mi aplicación.
Bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración

Y pon tu pregunta en los foros, gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 18:00:21.


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