Weno aproche que recién termine mi proyecto en java con ayuda netbeans para mostrar como hacer de manera sencilla un bloqueador de pantalla , e visto que muchos personas se preguntan como hacer para bloquear la pantalla mostrando un imagen o algo al estilo cibercafe. Pero claro asta aqui seria tan facil como crear un jframe sin bordes agregar un jlabel que contenga la imagen y iniciar siempre la ventana a pantalla completa pero claro ahora nos preguntamos que pasa si el usuario presiona alguna combinación de teclas como Alt+F4,Ctrl+Alt+Supr....etc.
Mi proyecto tiene 7 clases las principales son 3 :
La clase jFrameBlocked// esto es nuestro jframe ya creado con netbeans
La clase jBlocked // esta es la que nos permite evitar cerrar nuestra ventana por cualquier metodo
La clase Fondo // nos permite colocar un fondo a nuestro jframe
Las demás son solamente para darle un toque a lo Anonymous jeje.
1.- Crearemos un nuevo proyecto en netbeans llamado blocked, y a continuación un jframe llamado jFrameBlocked que tendra en siguiente diseño.(Aqui nose ven los jlabel porque estan en blanco)
2.- Ahora crearemos una clase llamada Fondo para poner un imagen de fondo a nuestro jframe y copiamos es siguiente codigo.
Nota: Tener en cuenta que yo puse mi imagen en una carpeta llamada imágenes
Código
import java.awt.Graphics; import javax.swing.ImageIcon; /** * http://jc-mouse.blogspot.com/ * @author Mouse */ String imagen; this.setSize(w,h); imagen = foto; } @Override g.drawImage(imagenFondo.getImage(),0,0,tamanio.width, tamanio.height, null); setOpaque(false); super.paintComponent(g); } }
3.-Para que la imagen ocupe toda la pantalla independientemente del monitor crearemos un clase llamada Resolución.
Copiamos el siguiente código:
Código
import java.awt.Dimension; import java.awt.Toolkit; /** * @web http://jc-mouse.blogspot.com/ * @author Mouse */ public class Resolucion { public void tamaño() { // TODO code application logic here //Obtiene el tamaño de la pantalla //obtiene la resolucion de la pantalla en PPP (Puntos por pulgada) //muestra la informacion por la consola de java // System.out.println("Tamaño de pantalla: " + d.width + "x" + d.height + ", definición: " + sr + " ppp"); jFrameBlocked.ancho = d.width ; jFrameBlocked.alto = d.height; } }
Y agregamos las siguiente líneas a nuestra clase jFrameBlocked que son las variables a las que se podrá acceder desde la clase fondo para modificarlas con la resolución de la pantalla.
Código
/** * Creates new form jFrameBlocked */ public static int alto; //copiamos public static int ancho;; //copiamos Resolucion resolucion = new Resolucion();; //copiamos
4.- También agregamos un método dentro de la clase de nuestro frame para llamar a la clase fondo para mas comodidad.
Código
Fondo p = new Fondo(ancho,alto,img); p.repaint(); }
5.- Luego añadimos otra clases mas llamada jBlocked que sera la encargada de enviar nuestro jframe al frente cada n milisegundos y asi no dara tiempo para usar alt+f4.. etc .
Copiamos el siguiente codigo.
Código
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.swing.JFrame; /** * @web http://www.jc-mouse.net/ * @author Mouse */ public class jBlocked { /** * Constructor de clase */ { this.jframe = f; } /** * ejecuta una tarea cada "n" tiempo * Para evitar que el usuario utilice las teclas (WINDOWS + D)(TAB) y asi perder el foco * de la aplicación, cada 50 milisegundos se envia el JFrame al frente y se cambia su propiedad a maximizado */ public void block() { ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate( { @Override public void run() { front(); } }, 500, 50 , TimeUnit.MILLISECONDS ); //comienza dentro de 1/2 segundo y luego se repite cada N segundos } public void front() { jframe.toFront(); } }
6.- Una vez que tenemos creado la clase jBlocked , Fondo y todo lo demas, debemos hacer lo siguiente
- Modificaremos el constructor de jFrameBlocked de la siguiente manera:
Nota: Mi imagen que voy a poner se llamada foto.jpg cambiar esto si su imagen tiene otro nombre
Código
public jFrameBlocked() { this.setUndecorated(true);//quita bordes a jframe initComponents(); resolucion.tamaño();// obtenemos el tamaño de la pantalla ColocarImagen("foto.jpg"); // colocamos nuestro fondo al frame this.setDefaultCloseOperation( DO_NOTHING_ON_CLOSE );//evita cerra jframe con ALT+C this.setExtendedState( MAXIMIZED_BOTH );//maximizado this.setAlwaysOnTop(true);//siempre al frente //nueva instancia de jBlocked pasando como parametros e este JFrame new jBlocked( this ).block(); }
Weno hasta aquí estaría todo lo principal echo pero como quiero darle un toque mas de estilo le voy a agregar sonidos y una alarma que suene el tercer intento fallido para los intrusos(osea mi hermana XD), primero creo otra clases llamada Alarma y copiamos este código que será el encargado de reproducir el sonido.
Antes crearemos un nueva carpeta dentro de un proyecto llamada sonido y colocaremos los archivos de sonido (en este caso yo tengo 6 archivo WAV )
Código
import java.net.URL; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; public class Alarma { try { sonido.open(audioInputStream); sonido.start(); if(bd == 0){ // si la bd(bandera) es 0 entonces reproduce la alarma una y otra ves }else{ //sino esperamos a que es archivo termine para cerrarlo while (sonido.isRunning()){ // verifica si el archivo todavía se esta reproduciendo // Se cierra el clip. Significa que acabo el archivo y tendremos que cerrarlo sonido.close(); } } //Thread.sleep(60000); // 1000 milisegundos (10 segundos) //sonido.close(); } } } }
Quiero aclarar que este código funciona muy bien cuando tengamos nuestro JAR
Ya que hay muchos códigos que he probado y solo reproduce el sonido cuando lo ejecutamos desde el netbeans, asi que aprovechen jeje.
Ya con todo listo solo nos queda colocar el código de los botón Aceptar y Cancelar este ultimo no es necesario solamente lo vamos a utilizar para cerrar nuestra aplicación en las etapas de prueba .
En el botón aceptar damos doble click y nos llevara al método del botón ay copiamos lo siguiente:
Nota: para que esto funcione deben tener los archivos que yo tengo sino solamente borren toda las líneas que usan la clase Alarma.
Código
int cont = 0 ; // nuestro contador para saber cuantas veces a fallado // este es el metodo de nuestro boton // TODO add your handling code here: if(this.user.getText().equals("") || this.pass.getText().equals("")){ Alarma alarma1 = new Alarma(); alarma1.Reproducir("Error-lockendo2.wav",1,3); JOptionPane.showMessageDialog( this, "Intruso alejate del computadora",".::ERROR::.",JOptionPane.ERROR_MESSAGE); }else{ // String clavemd5 = TestEncriptarMD5.encriptaEnMD5(this.pass.getText()); if( this.user.getText().equals("user") && this.pass.getText().equals("12345") ) { Alarma permitido = new Alarma(); permitido.Reproducir("acceso_permitido.wav",1,3); try { this.dispose(); Logger.getLogger(jFrameBlocked.class.getName()).log(Level.SEVERE, null, ex); } }else{ cont = cont+1 ; if(cont < 3){ Alarma alarma2 = new Alarma(); alarma2.Reproducir("Error-lockendo.wav",1,3); JOptionPane.showMessageDialog( this, "Usuario o contraseña invalida!",".::ERROR::.",JOptionPane.ERROR_MESSAGE); } if(cont == 2){ try { Alarma alarma3 = new Alarma(); alarma3.Reproducir("Error-lockendo3.wav",1,3); Logger.getLogger(jFrameBlocked.class.getName()).log(Level.SEVERE, null, ex); } } if(cont == 3){ //System.out.println(cont); Alarma alarma4 = new Alarma(); alarma4.Reproducir("Error-lockendo4.wav",1,3); //JOptionPane.showMessageDialog( this, "Te lo adverti!",".::ERROR::.",JOptionPane.ERROR_MESSAGE); Alarma alarma = new Alarma(); alarma.Reproducir("alarma.wav",0,0); cont = 0;// reiniciamos nuestro contador a 0 de nuevo } } } }
Para mayor seguridad yo había puesto la comparación de la contraseña en md5 pero para no complicar las cosas lo hice así directo, para los que le interese la clase llamada TestEncriptarMD5 para convertir string a md5 esta es:
Código
** * * @author Administrador */ /** * Instituto Tecnologico de Zacatepec * Descripcion: Encriptacion de paswords en MD5 * @author Gonzalo Silverio * Fecha: 03-12-2011 * Archivo: TestEncriptarMD5.java */ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class TestEncriptarMD5 { private static final char[] CONSTS_HEX = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' }; { try { byte[] bytes = msgd.digest(stringAEncriptar.getBytes()); StringBuilder strbCadenaMD5 = new StringBuilder(2 * bytes.length); for (int i = 0; i < bytes.length; i++) { int bajo = (int)(bytes[i] & 0x0f); int alto = (int)((bytes[i] & 0xf0) >> 4); strbCadenaMD5.append(CONSTS_HEX[alto]); strbCadenaMD5.append(CONSTS_HEX[bajo]); } return strbCadenaMD5.toString(); return null; } } { } }
Y en el botón cancelar solo ponemos System.exit(0); (este ultimo no es necesario solamente lo vamos a utilizar para cerrar nuestra aplicación en las etapas de prueba .)
Y terminamos ! ! ! Espero que les haya gustado ,cualquier sugerencia, error o critica constructiva comente . Y siendo sinceros me a costado escribir tanto porque me cuesta explicarme.
Para los que quieran descargar este proyecto completo y original :
http://espacio-hacker.blogspot.com/2013/07/java-bloqueador-de-pantalla-al-estilo.html
Paginas que me han ayudado al desarrollo de este proyecto y que son autoras de las mayorías de las clases que he puesto :
http://www.jc-mouse.net/