[Tutorial] Bloqueador de pantalla al estilo Anonymous

Iniciado por MarteagaM, 6 Agosto 2013, 19:22 PM

0 Miembros y 1 Visitante están viendo este tema.

MarteagaM

 


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 (java) [Seleccionar]


import java.awt.Graphics;

import javax.swing.ImageIcon;



/**

* http://jc-mouse.blogspot.com/

* @author Mouse

*/

public class Fondo extends javax.swing.JPanel {

   String imagen;

   public Fondo(int w,int h,String foto){    

       this.setSize(w,h);

       imagen = foto;

   }

       

   @Override

   public void paint(Graphics g){

       Dimension tamanio = getSize();

       ImageIcon imagenFondo = new ImageIcon(getClass().getResource("/imagenes/"+imagen));        

       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 (java) [Seleccionar]


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

       Dimension d = Toolkit.getDefaultToolkit().getScreenSize();

       //obtiene la resolucion de la pantalla en PPP (Puntos por pulgada)

       int sr = Toolkit.getDefaultToolkit().getScreenResolution();

       //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 (java) [Seleccionar]
public class jFrameBlocked extends javax.swing.JFrame {// esta es la clase de nuestro frame

   /**

    * 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 (java) [Seleccionar]
public void ColocarImagen(String img) {

       Fondo p = new Fondo(ancho,alto,img);

       this.add( p , BorderLayout.CENTER);

       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 (java) [Seleccionar]
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 {

   

   private JFrame jframe=null;

   

   /**

    * Constructor de clase

    */

   public jBlocked( JFrame f )

   {

       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(

           new Runnable()

           {

               @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.setExtendedState( JFrame.MAXIMIZED_BOTH );//maximizado

       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 (java) [Seleccionar]


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 (java) [Seleccionar]
import java.net.URL;

import javax.sound.sampled.AudioInputStream;

import javax.sound.sampled.AudioSystem;

import javax.sound.sampled.Clip;

public class Alarma {

       public static Clip sonido;

       

       public void Reproducir(String archivo,int bd,int duracion){

            URL path = Alarma.class.getResource("/sonido/"+archivo);

           try {

               sonido = AudioSystem.getClip();

               AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(path);

               sonido.open(audioInputStream);

               sonido.start();

               if(bd == 0){ // si la bd(bandera)  es 0 entonces reproduce la alarma una y otra ves

                   sonido.loop(Clip.LOOP_CONTINUOUSLY);// reproduce el fichero de sonido una y otra vez sin parar.

               }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();

           }

               catch (Exception tipoerror) {

               System.out.println("" + tipoerror);

       }



   }    

}


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 (java) [Seleccionar]
int cont = 0  ; // nuestro contador para saber cuantas veces a fallado

private void btnEntrarActionPerformed(java.awt.event.ActionEvent evt) {

 // 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 {

                   Thread.sleep(1000);

                   this.dispose();

                   Thread.sleep(1000);

                    System.exit(0);

               } catch (InterruptedException ex) {

                   

    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 {

                       Thread.sleep(1000);  

                       Alarma alarma3 =  new Alarma();

                        alarma3.Reproducir("Error-lockendo3.wav",1,3);

                   } catch (InterruptedException ex) {

     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 (java) [Seleccionar]
**

*

* @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' };

   public static String encriptaEnMD5(String stringAEncriptar)

   {

       try

       {

          MessageDigest msgd = MessageDigest.getInstance("MD5");

          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();

       } catch (NoSuchAlgorithmException e) {

          return null;

       }

   }



    public static void main(String args[])

     {

    System.out.println("\n\nEncriptacion en MD5 : '"+encriptaEnMD5("123")+"'");

  System.out.println("Encriptacion en MD5 de hola: '"+encriptaEnMD5("hola")+"'");

     

     }

}



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/


1mpuls0

#1
Gracias.

Lo probaré más tarde a ver qué tal.

Saludos.
abc

moi_realine

Lo necesitaba!
Gracias


-----   REGUN MUSIC   -----

Debci

Muchas gracias por tu código.
Una forma limpia y elegante de decidir el intervalo de ejecución de una tarea de un thread. Me ha gustado!

Saludos