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

Qt Discussion :

Génération d'événements clavier


Sujet :

Qt

  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 : 36
    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 Génération d'événements clavier
    Bonjour,

    Je souhaiterais pourvoir générer des évènements claviers (comme un appuie sur la lettre "A" par exemple), afin que ces évènements puisses être interprétés par une autre application.

    Voici le contexte :

    - Je vais réaliser une interface graphique via Qt, qui permettra à l'utilisateur de saisir un texte dans une zone de texte, ainsi qu'un chiffre s'y rapportant dans une zone voisine.

    - Le but et que l'appuie sur le chiffre en question simule l'appuie des touches présentes dans la zone asocciée. Par exemple "AZERTY" sera associé à "8" , donc l'appuie sur "8" doit entraîner la simulation d'appuie sur "A","Z","E","R","T","Y".

    - J'aurais terminé sous peu un keylogger écoutant uniquement les touches du pavé numérique, (ET NE STOCKANT RIEN !), dont le rôle sera de repérer l'appuie des chiffres en question.

    - Là, le problème arrive : je ne sais pas comment générer les évènements clavier "A","Z", etc. de manière à ce qu'ils puissent être interprété par une application plein écran.

    Mon programme tournera en effet en arrière plan, mais l'appui sur le chiffre "8" dans n'importe quel application plein écran doit faire comme si l'utilisateur tapait "A","Z", etc. sur son clavier directement dans l'application en question...

    En gros ce que je cherche à reproduire peu s'apparenter à un gestionnaire de macro.

    Avez vous des idées et/ou suggestions sur comment générer ces évènements afin qu'ils soient interprétable par d'autres applications qui auraient le focus (et même applications plein écran ). Google n'est en effet pas très bavard à ce sujet...

    Je vous remercier par avance,

    Mickaël

    Précision :
    - Développement sous Windows 7 via QTcreator
    - Pas besoin de portabilité Linux, le programme est destiné uniquement aux plates-formes Windows pour le moment.
    C'est en aidant les autres qu'on en apprend beaucoup soi-même

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 96
    Points : 85
    Points
    85
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <windows.h>
     
    // ...
     
    // lorsque 8 est pressé:
     
    HWND wnd = GetForegroundWindow(); // Fenetre qui a le focus à un instant donné
    PostMessage(wnd, WM_KEYDOWN, VK_A, NULL); // envoie de la touche A
    PostMessage(wnd, WM_KEYDOWN, VK_Z, NULL); // envoie de la touche Z
    PostMessage(wnd, WM_KEYDOWN, VK_E, NULL); // envoie de la touche E
    PostMessage(wnd, WM_KEYDOWN, VK_R, NULL); // envoie de la touche R
    PostMessage(wnd, WM_KEYDOWN, VK_T, NULL); // envoie de la touche T
    PostMessage(wnd, WM_KEYDOWN, VK_Y, NULL); // envoie de la touche Y

  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 : 36
    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 beaucoup pour cette réponse !
    je test cela ASAP.
    C'est en aidant les autres qu'on en apprend beaucoup soi-même

  4. #4
    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 : 36
    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
    L'interface graphique est terminée, le hook sur les touhces du pavé numérique fonctionne très bien, par contre pour simuler l'appui de touches... Aucune touche du type "VK_A" n'existe par exemple...

    j'ai trouvé des VK_RETURN pour la touche "enter", "VK_DIVIDE" pour "/", mais je ne trouve pas l'équivalent pour les lettres.

    Ensuite, je suppose qu'il faut faire un "KEYUP" afin de simuler le relachement des touhces une fois le "KEYDOWN" effectué ?

    Voici l'erreur que j'obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    PostMessage(wnd, WM_KEYDOWN, VK_RETURN, NULL);
            PostMessage(wnd, WM_KEYDOWN, VK_M, NULL);
            PostMessage(wnd, WM_KEYDOWN, VK_I, NULL);
            PostMessage(wnd, WM_KEYDOWN, VK_S, NULL);
            PostMessage(wnd, WM_KEYDOWN, VK_S, NULL);
            PostMessage(wnd, WM_KEYDOWN, VK_SPACE, NULL);
            PostMessage(wnd, WM_KEYDOWN, VK_T, NULL);
            PostMessage(wnd, WM_KEYDOWN, VK_O, NULL);
            PostMessage(wnd, WM_KEYDOWN, VK_P, NULL);
            PostMessage(wnd, WM_KEYDOWN, VK_RETURN, NULL);
    donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'VK_M' was not declared in this scope
    'VK_I' was not declared in this scope
    'VK_S' was not declared in this scope
    'VK_T' was not declared in this scope
    'VK_O' was not declared in this scope
    'VK_P' was not declared in this scope
    Donc il reconnait bien RETURN, SPACE, mais pas les lettres simple... et je ne comprend pas pourquoi
    C'est en aidant les autres qu'on en apprend beaucoup soi-même

  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 : 36
    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
    Bon après pas mal de recherches, j'ai trouvé une phrase magique dans une doc JAVA expliquant que les VK_xxx étaient des codes principalement fait pour les caractères non alphanumériques.

    J'ai donc eu l'envie de passer directement les Char en paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            PostMessage(wnd, WM_KEYDOWN, VK_RETURN, NULL);
            PostMessage(wnd, WM_KEYUP, VK_RETURN, NULL);
            PostMessage(wnd, WM_KEYDOWN, 'M', NULL);
            PostMessage(wnd, WM_KEYDOWN, 'I', NULL);
            PostMessage(wnd, WM_KEYDOWN, 'S', NULL);
            PostMessage(wnd, WM_KEYDOWN, 'S', NULL);
            PostMessage(wnd, WM_KEYDOWN, VK_SPACE, NULL);
            PostMessage(wnd, WM_KEYDOWN, 'T', NULL);
            PostMessage(wnd, WM_KEYDOWN, 'O', NULL);
            PostMessage(wnd, WM_KEYDOWN, 'P', NULL);
            PostMessage(wnd, WM_KEYDOWN, VK_RETURN, NULL);
            PostMessage(wnd, WM_KEYUP, VK_RETURN, NULL);
    Et cela fonctionne parfaitement !
    Merci pour votre aide

    PS : pour une raison que j'ignore, je ne peu pas éditer mon premier message afin de passer le sujet en résolu... si un modo pouvait le faire, merci.
    C'est en aidant les autres qu'on en apprend beaucoup soi-même

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

Discussions similaires

  1. [API windows] Récupérer proprement les évènements clavier...
    Par heider dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 20/03/2006, 13h05
  2. [MFC][VC++.NET]gestion évènement clavier
    Par Rafoo dans le forum MFC
    Réponses: 2
    Dernier message: 14/12/2005, 09h29
  3. [VB.NET]Génération d'événement
    Par Franckintosh dans le forum VB.NET
    Réponses: 10
    Dernier message: 03/11/2005, 11h34
  4. Réponses: 5
    Dernier message: 25/07/2005, 09h29
  5. Problème évènements clavier
    Par julie20 dans le forum Langage
    Réponses: 3
    Dernier message: 24/09/2003, 12h39

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