Iniciar la aplicación solo al introducir la clave correcta (C#)O como iniciar una aplicación con clave de acceso. |
Ejemplo para C# (2002/2003) de cómo iniciar una aplicación en la que se le pide al usuario una clave de acceso. Si la clave es correcta se mostrará el formulario principal, y si la clave no es correcta se cerrará la aplicación. También te muestro cómo permitir más de un intento para introducir esa clave, y si superas ese número, se acaba la aplicación.
|
Introducción:
Esto es algo que mucha gente pregunta, pero que no tenía por aquí publicado, así que ya era hora.
El tema es que tenemos una aplicación de tipo "desktop" (Windows.Forms) en la que necesitamos que el usuario introduzca una clave para poder usarla. El problema con el que se encuentran algunos de los que intentan hacer esto es que escriben el código en el formulario principal y si la clave no es correcta, lo cierran, pero debido a como maneja Visual Studio .NET el tema de los formularios, al cerrar ese formulario principal, se cierra toda la aplicación... ¡incluso si la clave es correcta!La solución es crear un formulario para comprobar esa clave, a ese formulario lo llamamos justo al iniciarse la aplicación, de forma que si la clave introducida es correcta, se muestre el formulario principal, y si no es correcta, cerramos la aplicación.
Debido a que Visual Basic y C# manejan de forma diferente el código insertado automáticamente en el formulario, he preferido separar en dos artículos este "truco", así los desarrolladores de C# no tendrán que aguantar las particularidades de Visual Basic .NET y viceversa, además de que así queda más claro todo al no tener que explicar cosas diferentes en cada caso, ya que esos dos lenguajes en el fondo van a usar el mismo código (o casi), pero la forma de implementarlo será diferente.
También he puesto independiente el código para las versiones anteriores a Visual Studio 2005 ya que en el caso de Visual Basic 2005 hay que usar otros cuadros de diálogos y con esta separación también quedará más claro todo.
El hacer estas "separaciones" según el lenguaje y las versiones de esos lenguajes, es porque principalmente los que lean esto serán aquellos que están empezando a programar, y cuanto más claro esté todo, mejor se aprende.
Aquí te dejo los links a los otros artículos:
- Este otro es para Visual C# 2005 (.NET 2.0)
- Este link es para el código de Visual Basic .NET (2002/2003) (.NET 1.x)
- Pulsa aquí, si te interesa ver el código y la explicación para Visual Basic 2005 (.NET 2.0)
- Si quieres saber cómo hacer esto mismo pero usando una base de datos (VB2003)
- Si quieres saber cómo hacer esto mismo pero usando una base de datos (C# 2003)
Crear el proyecto de ejemplo:
Los pasos que tenemos que dar para crear la aplicación de ejemplo son los siguientes:
- Crea un nuevo proyecto del tipo Windows.Forms (Aplicación para Windows).
- Tendremos un formulario llamado Form1, por simplicidad vamos a dejarle ese mismo nombre (Form1).
- Añade a ese formulario una etiqueta en la debes escribir lo que quieras, simplemente es para que sepas que es el formulario principal de tu aplicación. Por supuesto en este formulario es donde tendrás que hacer todo lo que tu aplicación deba hacer.
- Añade un segundo formulario al que le darás el nombre FormAcceso, inicialmente se llamará Form2, pero si le cambias el nombre justo al añadirlo, será más cómodo.
- En ese formulario de acceso, que será el que usemos para pedir la clave, añade una etiqueta, una caja de textos y dos botones.
- Modifica la propiedad FormBorderStyle para que tenga el valor FixedDialog.
- Asigna un valor False a las propiedades ControlBox, MaximizeBox y MInimizeBox.
- A la caja de textos dale el nombre txtClave y si no quieres que se vea la clave mientras se escribe, asigna un * a la propiedad PasswordChar.
- A los botones, le asignas los nombres btnAceptar y btnCancelar, y los textos Aceptar y Cancelar respectivamente.
- Sitúa esos controles donde más te guste, por ejemplo, puede tener un aspecto como el mostrado en la figura 1:
Figura 1. El formulario para la clave de acceso
- Haz dobleclick en el botón de Cancelar y sustitúyelo por el siguiente código, en el que asignamos el valor Cancel al valor devuelto por la propiedad DialogResult que es el valor que devuelve el método ShowDialog de ese formulario (más abajo verás cómo se usa), en lugar de cerrar el formulario, lo ocultamos para que todo funcione mejor.
private void btnCancelar_Click(System.Object sender, System.EventArgs e) { this.DialogResult = DialogResult.Cancel; Hide(); }
- Haz dobleclick en el botón Aceptar y escribe el código de más abajo, en el que hacemos la comprobación de si la clave escrita es la correcta, en este caso 123456, si es así, asignamos un valor OK y si no lo es, asignamos cualquier otro valor, ya que en nuestro código de validación, daremos como que la clave es correcta si tiene el valor OK. Aquí también ocultamos el formulario de las claves con Hide para que continúe la ejecución del programa y vuelva al código desde el que se ha mostrado este formulario.
private void btnAceptar_Click(System.Object sender, System.EventArgs e) { if( txtClave.Text == "123456" ) { this.DialogResult = DialogResult.OK; } else { this.DialogResult = DialogResult.No; } Hide(); }
- En ambos casos, se supone que los nombres de los controles son como te he comentado, si no es así, pues deberás cambiar los nombres de los controles, así que, te recomiendo que para este ejemplo uses los nombres que te indico.
- Una vez hecho esto, ya tenemos el código del formulario que pide la clave de acceso.
- Tal como está el código solo tendrás un intento para escribir correctamente la clave, después veremos cómo cambiar el código para que tengas el número de intentos que quieras.
- Ahora vamos a modificar el código del formulario principal, (Form1).
- Busca el código del método Main y sustitúyelo por este otro:
[STAThread] static void Main() { FormAcceso fAcceso = new FormAcceso(); if( fAcceso.ShowDialog() == System.Windows.Forms.DialogResult.OK ){ fAcceso.Close(); Application.Run(new Form1()); } }
- Con esto lo que hacemos es cargar el formulario que pide la clave, y si escribes la clave correcta, se cargará el formulario principal (Form1), si no es correcta, el valor devuelto por ShowDialog será distinto de OK, por tanto no se carga en memoria el formulario principal y se acabará la aplicación.
Para cargar el formulario principal usamos Application.Run al que le pasamos el formulario que queremos que se utilice como inicio, es decir, ese formulario será el que mantenga la aplicación abierta, en cuanto se cierre el formulario principal (Form1) la aplicación finalizará.- En C#, a diferencia de Visual Basic, no tenemos que indicarle que use el método Main para iniciar la aplicación, ya que siempre es así.
- Ahora puedes probar a ver si todo funciona bien, para ello, pulsa en F5 y te mostrará el formulario de acceso, escribe 123456 y pulsa en Aceptar, verás que te muestra el formulario principal (Form1).
- Si pulsas en Cancelar o escribes mal la clave, se cerrará el programa.
Mejoras al código
Ahora vamos a mejorar un poco el código.
Lo primero que vamos a hacer es asignar a los botones del formulario que pide la clave la funcionalidad que normalmente suelen tener, aunque esto lo dejo a tu gusto, esa funcionalidad es que al pulsar Intro sea como si pulsáramos en el botón Aceptar, de esta forma, el usuario escribe la clave y pulsa Intro en tener que buscar el botón y hacer click, aunque también puede hacerlo y todo funcionará igual. La otra característica es que el botón Cancelar se asocie con la tecla ESC, de forma que si el usuario pulsa esa tecla sea lo mismo que si hubiera pulsando en Cancelar.
Para conseguir esto, debes hacer lo siguiente:
- Muestra el formulario de la clave de acceso y pulsa una vez en cualquier parte del formulario, pero no en ninguno de los controles.
- Ahora en la ventana de propiedades (si no la ves, pulsa F4), selecciona la propiedad AccepButton y de la lista desplegable (ver la figura 2) selecciona btnAceptar.
Figura 2. Asignar el botón predeterminado
- Una vez hecho eso, verás que el botón Aceptar tiene un borde más oscuro, eso indica que es el botón predeterminado, por tanto será el que reciba la pulsación de la tecla Intro.
- Ahora selecciona la propiedad CancelButton y de la lista selecciona btnCancelar.
- Ya tienes esa funcionalidad, que puedes probar si inicias la aplicación (F5) y después de escribir la clave pulsas INTRO, verás que no tienes que hacer click en el botón Aceptar.
- Lo mismo ocurre si pulsas la tecla ESC, verás que se cierra la aplicación aunque la clave sea correcta, ya que en realidad es como si hubieras pulsado en el botón Cancelar.
Sigamos con las mejoras:
Permitir varios intentos fallidos antes de cerrar la aplicación
Como es posible que el usuario se equivoque al escribir o se olvide de la clave, vamos a darle algunas oportunidades más, por ejemplo tres.
Para hacer esto, tenemos que modificar el código del formulario de acceso, por tanto muestra el panel del código de ese formulario (FormAcceso) y antes del código que añadimos al principio, escribe esto:
private int veces = 0; const int NumeroIntentos = 3;La constante NumeroIntentos tendrá el valor de las veces que vamos a permitir que escriba la clave antes de darlo como cosa perdida y cerrar la aplicación.
Ahora escribe esto en el método del botón Aceptar, de forma que esto sea el nuevo código:
private void btnAceptar_Click(System.Object sender, System.EventArgs e) { if( txtClave.Text == "123456" ) { this.DialogResult = DialogResult.OK; } else { // Permitir varios intentos veces = veces + 1; if( veces < NumeroIntentos ) { Label1.Text = "Quedan " + (NumeroIntentos - veces) + " intentos"; return; } this.DialogResult = DialogResult.No; } Hide(); }Lo que hacemos es incrementar el contenido de la variable veces cada vez que se pulse en Aceptar, pero cuando la clave que escribimos no es la correcta, ya que si es correcta no hay que dar más intentos, je, je. Si el valor de esa variable en menor que el número máximo de intentos, modificamos el contenido de la etiqueta que hay junto a la caja de textos (Label1) para que muestre los intentos que quedan. Si superamos ese número se volverá al otro código y se acabará la aplicación.
Y esto es todo, espero que te haya resultado sencillo de comprender, y si ya tenías más experiencia, espero que sepas perdonar que lo haya explicado tan "paso a paso".
¡Que lo disfrutes!
Nos vemos.
Guillermo