Partage
  • Partager sur Facebook
  • Partager sur Twitter

Générateur de clics

Sujet résolu
    7 mai 2008 à 21:20:44

    Bonjour tout le monde!

    Voila je voudrais créer une apllication Java pour générer des clics souris. En gros quand j'appuis sur une touche définie préalablement, je souhaite que cela créé des clics souris consécutifs.

    Pour cela j'ai choisi java et j'ai recherché dans la doc, il y a la classe Java.awt.Robot qui permet de faire ceci. Alors voici ce que j'ai fait:
    import java.awt.AWTException;
    import java.awt.Robot;
    
    public class autoclic extends Robot {
    //création de l'attribut robot
    private Robot robot;
    
    	public void init() throws AWTException{
    		robot = new Robot();
    	}
    	
    	public void run(){
    		while(true){//pour tester on fait une boucle infinie
                    //un appuie bouton 1 (je ne sais pas si ça correspond au bouton gauche)   
    		robot.mousePress(1);
                    //une petite attente
    		robot.delay(1000);
                    //on relache le bouton
    		robot.mouseRelease(1);
    		}
    	}
    	
    //un main vide (voir erreur ci dessous)
    	public static void main(String[] args) {
    		
    		}
    }
    


    Alors voila j'ai fais ce petit bout de code pour tester. Eclipse m'a fait rajouter "throws AWTException" quand j'ai créer l'objet robot.
    Cela me retourne cette erreur là quand je lance l'application java:
    Exception in thread "main" acm.util.ErrorException: Cannot determine the main class.
    at acm.program.Program.main(Program.java)


    Je précise que j'ai inclue dans le projet un Jar extérieur, la libraire acm, je suis étudiant en première année de BTS informatique et j'ai appris a coder avec ceci.

    Voila si quelqu'un peu me venir en aide, je l'accueillerais a bras ouverts!!

    Merci d'avoir lu mon post.
    • Partager sur Facebook
    • Partager sur Twitter
      7 mai 2008 à 21:23:38

      Salut,

      il faut que tu instancie ton code non ? avec ceci par exemple dans ton main :

      autoclic MonRobot = autoclic();

      C'est peut etre ca mais je suis pas sure
      • Partager sur Facebook
      • Partager sur Twitter
        7 mai 2008 à 21:27:55

        Merci de ta réponse!

        Non ce n'est pas ça j'avais déjà éssayé, éclipse me demande de créer la méthode "auoclic".

        En fait le main en Java je ne sais pas a quoi il sert les profs nous ont dit "là vous mettez un main() "quand il y en avais besoin et j'ai pas réussi a avoir des infos la dessus..
        • Partager sur Facebook
        • Partager sur Twitter
          7 mai 2008 à 21:30:24

          Ben le main ça sert a lancer ton programme.

          Citation : Tuto sur le Java

          Cette classe doit contenir (applet mise à part) une méthode main. Celle-ci est la méthode principale du programme, c'est elle que la JVM va chercher afin de lancer votre programme. Pour faire court, c'est le point de départ du programme.
          Vous voyez donc son importance !



          Bon d'apres ton erreur je pense que ton problème se situe dans le main
          • Partager sur Facebook
          • Partager sur Twitter
            7 mai 2008 à 21:35:39

            d accord le main sert a lancer mon programme, mais certains programme n'ont pas besoin de main pour se lancer.
            Vu l'erreur qu'il me met ça doit etre dans le main aussi c'est ce que je pense mais je ne trouve pas :) .

            En cours j'utilisé le main() quand l'on avait des thread dans nos code, et on faisait appel a la méthode start().

            Je me disais que la classe robot avait peut être besoin d'un écouteur ou un truc comme ça.

            Tenez si ça peut aider ou empêcher de chercher voici la doc pour la classe Robot:
            http://java.sun.com/javase/6/docs/api/
            • Partager sur Facebook
            • Partager sur Twitter
              7 mai 2008 à 21:41:44

              Alors je viens de lire ceci : http://java.sun.com/javase/6/docs/api/java/awt/Robot.html

              Je ne trouve pas les méthodes run et init. Peut être ai-je mal vu je sais pas
              • Partager sur Facebook
              • Partager sur Twitter
                7 mai 2008 à 21:45:04

                Les méthodes run() et init() ne sont pas des méthode de la classe Robot, ce sont des méthodes comment dire universelle :) .
                Dans l'init() j'initialise mon objet Robot et dans le run() je m'en sert.
                • Partager sur Facebook
                • Partager sur Twitter
                  7 mai 2008 à 21:49:31

                  Ben alors copie/colle le code de ton init et du run dans ton main. Car la tu as deux main.

                  import java.awt.AWTException;
                  import java.awt.Robot;
                  
                  public class autoclic extends Robot {
                  //création de l'attribut robot
                  private Robot robot;
                  
                  	
                  	public void run(){
                  		while(true){//pour tester on fait une boucle infinie
                                  //un appuie bouton 1 (je ne sais pas si ça correspond au bouton gauche)   
                  		robot.mousePress(1);
                                  //une petite attente
                  		robot.delay(1000);
                                  //on relache le bouton
                  		robot.mouseRelease(1);
                  		}
                  	}
                  	
                  //un main vide (voir erreur ci dessous)
                  	public static void main(String[] args) throws AWTException {
                                         robot = new Robot();
                                         run();
                  		
                  		}
                  }
                  


                  Je ne suis pas sure du throws AWTException regarde ou eclipse te le mets ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 mai 2008 à 21:56:26

                    hello

                    j'ai un peu regardé ta classe et j'en ai fait une sur le même model et qui marche :
                    import java.awt.AWTException;
                    import java.awt.Robot;
                    import java.awt.event.InputEvent;
                    import javax.swing.SwingUtilities;
                    
                    public class AutoClic extends Robot { // Nom de la classe avec majuscule
                    
                    	public AutoClic() throws AWTException {
                    		super(); // appele du contructeur de la classe Robot
                    	}
                    
                    	public void run(){
                    		System.out.println("mousePress");
                    		this.mousePress(InputEvent.BUTTON1_MASK); // Utiliser les variables et pas directement des int
                    
                    		this.delay(1000);
                    
                    		System.out.println("mouseRelease");
                    		this.mouseRelease(InputEvent.BUTTON1_MASK);
                    		
                    		System.exit(0);
                    	}
                    	
                    	public static void main(String[] args) {
                            SwingUtilities.invokeLater(new Runnable() {
                                public void run() {
                                	try {
                                		AutoClic autoclic = new AutoClic(); // Nouvelle instance de ta classe
                                		autoclic.run(); // On la lance
                                	}
                                	catch(AWTException e) {
                                		e.printStackTrace(); // On affiche l'erreur s'il y en a une (ici impossible)
                                	}
                                }
                            });
                        }
                    }
                    


                    Surtout n'hésite pas à demander si tu as des questions sur mon code.



                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 mai 2008 à 21:58:40

                      Non ça ne fonctionne pas, j'ai toujours la meme erreur (dans ce cas là tu ne peux pas mettre le main en static vu que le run() et l'objet robot ne sont pas static, mais c'est le copier-coller ;) ).

                      Eclipse me souligné en rouge le nom de ma classe et me demandé de créer un constructeur il m'a généré ce code la:
                      public autocilc() throws AWTException {
                      		super();
                      		// TODO Auto-generated constructor stub
                      	}
                      


                      Mais ça ne fonctionne pas pour autant.
                      Je me posé la question ai je bien fait d'extend la classe Robot?? ne ferais-je pas mieu de l'extend consoleProgramme et d'importer ensuite la classe robot??
                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 mai 2008 à 22:03:36

                        Regarde le code qu'a fait Tarfaa me parait bien mais je n'ai pas eclipse sous la main.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          7 mai 2008 à 22:07:15

                          EDIT
                          Wouha merci Tarfaa tu gère trop!!

                          J'avais commencé une classe en mode console et je vené de me rendre compte que le 1 dans les méthode mousPress() et mouseReleas() n'été pas bons, mais j'été persuadé que "InputEvent.BUTTON1_MASK" été une variable a changer.

                          Super le code génial, ça fonctionne bien.

                          Je découvre qu'il faut créer la méthode run() dans le main(), ya deux chose que je ne connais pas c'est le "try" et le "catch" serait-il possible que tu m'explique brièvement le fonctionnement??

                          EDIT
                          Je rajoute "SwingUtilities.invokeLater", inconue au bataillon aussi, mais j'imagine que c'est pour permettre au robot de se lancer ou un truc dans le genre?

                          Encore merci!!
                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 mai 2008 à 22:19:20

                            Citation : herudo

                            J'avais commencé une classe en mode console et je vené de me rendre compte que le 1 dans les méthode mousPress() et mouseReleas() n'été pas bons, mais j'été persuadé que "InputEvent.BUTTON1_MASK" été une variable a changer.


                            Non c'est une variable déclarée en final (que l'on met en majuscules). Les développeurs font ça pour que la valeur réelle de cette variable puisse être changée à tout moment, sans conséquences sur les programmes, de plus de cette manière le code est plus lisible.

                            Citation : herudo

                            Je découvre qu'il faut créer la méthode run() dans le main()


                            Attention ce n'est absolument pas obligatoire ! J'ai simplement lu que c'était mieux de procéder de cette façon, mais voilà une méthode main qui marche tout aussi bien :
                            public static void main(String[] args) {
                            		try {
                            			AutoClic autoclic = new AutoClic(); // Nouvelle instance de ta classe
                            			autoclic.run(); // On la lance
                            		}
                            		catch(AWTException e) {
                            			e.printStackTrace(); // On affiche l'erreur s'il y en a une (ici impossible)
                            		}
                            	}
                            


                            Citation : herudo

                            ya deux chose que je ne connais pas c'est le "try" et le "catch" serait-il possible que tu m'explique brièvement le fonctionnement??


                            C'est pour "catcher" une erreur, soit "l'attraper", la "récupérer", bref cherche un bon tuto, ça serra expliqué dans la partie sur les Exceptions.

                            Citation : herudo

                            Je rajoute "SwingUtilities.invokeLater", inconue au bataillon aussi, mais j'imagine que c'est pour permettre au robot de se lancer ou un truc dans le genre?!


                            Non, comme avant ce n'est pas obligatoire, utilise plutôt la méthode main que je te donne dans ce post, elle est plus lisible et plus simple.

                            Citation : herudo

                            Encore merci!!


                            Mais de rien ;)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              7 mai 2008 à 22:25:17

                              Super franchement je te remercie, j'ai appris pas mal de truc grâce a toi.

                              Je vais me documenter pour améliorer ce programme maintenant, je souhaite qu'il y ai un clic tout les dixième de seconde, mais surtout je souhaite que les clics commencent uniquement a l'appuie d'une touche particulière que je choisirais et qu'il s'arrêtent a l'appuie d'une nouvelle touche.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                7 mai 2008 à 22:29:47

                                ok ;)

                                bon courage alors !

                                et si tu as un gros problème demandes. Mais essais tout de même de trouver la solution sur internet, on apprend beaucoup de cette manière.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  7 mai 2008 à 22:33:11

                                  oui je recherche dans la documentation de java et sur les forums, si je ne trouve pas mon bonheur je passerais sur le site du zéro réclamer aide et assistance, j'ai toujours été comblé, et j'en remercie les créateurs du site et tout les membres qui ont pu m'aider jusque là.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    7 mai 2008 à 23:01:12

                                    Pour comprendre
                                    EventQueue.invokeLater(runnable);
                                    EventQueue.invokeAndWait(runnable);
                                    Il faut comprendre le mécanisme d'affichage des composants swing. En fait ce sont deux mécanismes de l'EDT (Event Dispatch Thread) et il est presque indispensable de les utiliser pour une grosse appli swing. Imagine que ta GUI soit un peu imposante. Sans Thread spécifique, le chargement de l'interface graphique va "geler" le chargement du programme et l'utilisateur ne pourra rien faire d'autre qu'attendre devant une fenêtre blanche. Grâce à invokeLater, l'interface n'est affichée qu'une fois entièrement calculée, et instructions qui suivaient le setVisible(true) sont effectuées dans le mainThread.
                                    Avec invokeAndWait, l'EDT attend que l'affichage de la GUI ait eu lieu avant que le déroulement du programme reprenne.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      7 mai 2008 à 23:16:12

                                      d accord rom1dep je te remercie pour tes explications!

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Générateur de clics

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                      • Editeur
                                      • Markdown