Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Formulario que inhabilite todas las funciones (https://www.clubdelphi.com/foros/showthread.php?t=77640)

pape19 14-02-2012 20:00:00

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.

roman 14-02-2012 20:11:19

¿Para qué quieres que se vea el escritorio si de todas maneras va a ser inaccesible?

// Saludos

pape19 14-02-2012 20:15:30

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.

roman 14-02-2012 20:24:14

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

pape19 14-02-2012 20:41:10

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.

BlueSteel 14-02-2012 21:25:33

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:D

roman 14-02-2012 21:29:12

Cita:

Empezado por pape19 (Mensaje 425168)
No conocía esa herramienta. Igualmente probé y el rendimiento es algo ineficiente.

¿En qué sentido es ineficiente?

// Saludos

Chris 14-02-2012 22:15:14

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

bosster_018 17-02-2012 06:07:44

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 :rolleyes:)

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 :confused:

OmarEnrique 08-03-2018 16:05:04

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.

Casimiro Notevi 08-03-2018 18:57:37

Cita:

Empezado por OmarEnrique (Mensaje 524995)
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.


La franja horaria es GMT +2. Ahora son las 04:38:24.

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