IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

Garder le focus


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut Garder le focus
    Bonjour à tous.

    J'ai un problème de focus dans certaines de mes applications nécessitant de tourner en arrière plan. je m'explique par un exemple concret :

    Pour un chat de jeux, je veux pré-programmer des phrases que l'utilisateur peut attribuer aux boutons 1 à 9 du pavé numérique. Une fois cela fait, si l'on appui sur la touche correspondante, la phrase apparait en texte à l'endroit du curseur.

    Cela ne pose pas de problème pour des applications fenêtrés, mais si par exemple je lance un jeu en plein écran, cela ne fonctionne plus. Or, c'est justement ce que je souhaiterais, que l'appuie sur les touches m'qffichent bien les phrases programmés dans le jeux...

    Voici la creation de ma fenêtre (extends JFrame) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    private void creationFenetre() throws IOException{
    		setTitle("League Of Legend : Macro Manager");
    		setMinimumSize(new Dimension(600,340));
    		setResizable(false);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setLocationRelativeTo(null);
     
    		BorderLayout bl = new BorderLayout();
    		setLayout(bl);
     
    		this.jpAcceuil = new JPanel(){
     
    			protected void paintComponent(Graphics g){
    				Image img = new ImageIcon(this.getClass().getResource("/LolMacrobackground.jpg")).getImage();
    				g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
    				g.setColor(Color.GRAY);
    			    g.drawString("mickael.bettembourg@gmail.com", 1, getHeight()-5);
    			}
    		};
    		this.jpAcceuil.setLayout(null);	
    		add(this.jpAcceuil,bl.CENTER);
     
    		setComponent();
    		lolmc = new LolMacroController();
    		lolmc.autoLoad();
    		setVisible(true);
     
    		event();
    		this.jpAcceuil.requestFocus();
    	}
    et voici un des listener (je lui fais afficher "yes" pour les tests... )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private void event() {
    		this.jpAcceuil.addKeyListener(new KeyListener(){
     
    			@Override
    			public void keyPressed(KeyEvent e) {
    				System.out.println("yes");
     
    			}
    Donc pour le moment le listener écoute toutes les touches, le temps d'arriver régler le problème de focus.

    Quelqu'un sait-il comment je peux faire pour que même si j'ai une appli en plein écran, le listener capte quand même l'appui sur une touche ?

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    je n'ai pas compris, ton focus il est sur la fênetre en plein écran ou sur une fenêtre en arrière plan??

  3. #3
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    pour préciser :

    - l'application que je crée est destiné à tourner en arrière plan
    - Quand je lance une appli pleine écran, l'appli plein écran prend le focus
    - Mon appli qui s'éxécute alors derrière ne répond plus aux évenements d'appuis sur les touches du clavier


    par exemple je lance un jeu, genre un bon Battlefield. Mon programme java tourne lui en arrière plan.
    En ouvrant le chat du jeu, si j'appuie sur la touche "1" je devrais voir apparaitre la phrase "yes", or, cela m'affiche "1" et uniquement "1"

    Donc je ne trouve pas comment faire pour que mon appli (celle en arrière plan) réagisse aux évenements clavier et simule l"appuis sur des autres touches lorsque j'ai une application plein écran lancé devant.


    ps : en gros ce que je cherche à coder est un gestionnaire de macro, comme il éxiste pour les clavier G11, G15 et autre...

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    ce n'est plus une question de focus, l'application au premier plan est TOUJOURS celles qui a le focus. Ce que tu cherche à faire n'est ni plus ni moins qu'un logiciel qui intercepte le clavier au niveau de l'OS, c'est ça ce n'est pas possible en java directement, il faudra passer par des appels système pour enregistrer des Hooks et les traiter. Pour faire ces appel système, il faudra passer par une couche native.

  5. #5
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    En effet c'est bien ce que je souhaite faire.

    Quand tu parle d'une couche native, qu'entends tu par là ? Car faire des appels système je vois bien comment faire, mais je ne comprend pas le "passer par une couche native".

    C'est la première application de ce genre que je réalise, et ce ne sera probablement pas la dernière, donc malgré la complexité apparente de la tâche, j'aimerais m'y lancer.

    Donc si quelqu'un à une méthodologie, plan, piste, idéé, conseil, bout de code ou autre, je suis preneur

    et merci pour ta réponse tchize_

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    En fait il que tu trouves comment faire ça dans un langage natif de la plateforme, avec les API natives (.NET/MFC & cie sous windows, XWindow sous unix/linux & cie) puis que tu lies ça à ton code java via des API comme JNI ou JNA (a toi de te diriger vers les tutos de ces API permettant d'appeler du code natif depuis java, ou d'appeler du java depuis du code natif).

    Bref au final tu ferais mieux de directement faire ça en C/C++ ou autres. Java n'est pas vraiment le bon plan pour des tâches bas niveau comme celles ci. De plus ce que tu cherches à faire s'apparente à un KeyLogger et c'est pas des plus plaisants/légal comme bestiole)

  7. #7
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    Merci pour ta réponse, ja vais aller voir de côté de ces API.

    Keylogger, pas vraiment, car l'utilisateur est libre de déterminer les touches qui seront écoutées et de leur attribuer des fonctions. Le but est plus ici de rendre possible la création de macro pour des utilisateurs n'ayant pas de clavier spécifique. Aucune connexion réseau n'est faite ni de données stockées...

    Bon donc en gros mon interface graphique toute finie en Java est bonne pour la poubelle... je vais éssayé de voir C++/QT mais mes compétences dans ce domaine sont moindre comparés à JAVA...

    Et bien merci à tous.

  8. #8
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Tu peux garder ton interface java, le tout est que tu vas devoir te fader la partie écoute du clavier en background en C/C++/.NET/WhateverAPI. Puis lier ton développement C/C++ à ton interface java en utilisant JNI ou JNA.

  9. #9
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    ok ok, merci

  10. #10
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    Je pensais à une chose...

    Cela simplifierai t-il le problème si je n'avais pas besoin de "neutraliser" la touche clavier saisit. A savoir si j'appuie sur le "1" du pavé num, je me fou qu'il agisse normalement et qu'il affiche 1 ou autre, Je veux juste arriver à récuperer l'evenement.

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    non ca ne change rien, seule un application qui a le focus reçois le clavier, pour des raisons assez évidentes.

  12. #12
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    D'accord merci. la je viens de trouver des sources en C qui stockent toutes les touches clavier dans un fichier HookClavier.txt . Je vais voir comment adapter cela pour ne surveiller que les chiffres, et ensuite arriver le lier à mon Java...

    En java est-il possible de mettre un listener sur un fichier afin de récuperer un évenement lorsqu'il est modifié ?

  13. #13
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Ce serait plutôt au code C d'appeler une classe java en fait. C'est faisable via JNI.

  14. #14
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    J'ai regardé côté JNI/JNA, et il me semble que c'est uniquement pour appeler du C/C++ depuis JAVA.

    Ce qu'il faudrait, c'est que je lance mon appli java, que le java lance le hook clavier en C/C++, et que mon java puisse récuperer les données.

    Et je coince sur ce dernier point. Je ne vois pas comment envoyer les données lu par le C/C++ a mon programme java.

    Si le C/C++ écrit sur la sortie standard les chiffres lu, java peut-il les récuperer via un input stream ?

  15. #15
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Si, il est possible d'appeler des méthodes java au moins en JNI:

    http://java.sun.com/developer/online...iref.html#call

  16. #16
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    Ah en effet... je n'avais pas pensé a aller voir l'utilisation de JNI dans le langage C/C++ lui même...

    Je pense que cela résoudra mon problème. Donc la méthodologie serait la suivante :

    - lancement de l'appli JAVA
    - l'appli JAVA lance le Hook C/C++
    - le Hook C/C++ appèle une méthode "NumberPressed()" du programme JAVA en passant le chiffre correspondant en paramètre
    - JAVA génère la série d'actions correspondant à ce que l'utilisateur aura spécifié dans l'interface graphique pour l'appuie de cette touche.

    La méthode vous parait-elle appropriée niveau clarté et niveau performances ? Car n'ayant jamais travaillé en mixant les langages, vos avis sont importants.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Garder le focus et selectionner tout le texte
    Par Ender dans le forum Access
    Réponses: 2
    Dernier message: 14/08/2006, 13h29
  2. [C#]garder le focus sur un node d'un treeview
    Par Blo0d4x3 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/05/2006, 22h23
  3. Réponses: 4
    Dernier message: 22/12/2005, 18h05
  4. Garder le focus si condition fausse
    Par Alexandre Sahli dans le forum IHM
    Réponses: 12
    Dernier message: 07/12/2005, 16h53
  5. [VB.NET] Garder le focus de l'ascenceur
    Par Dnx dans le forum ASP.NET
    Réponses: 2
    Dernier message: 08/07/2005, 17h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo