C++ Attente d'un clique gauche
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

C++ Attente d'un clique gauche



  1. #1
    Eroos

    Question C++ Attente d'un clique gauche


    ------

    Bonjour,

    Je développe actuellement une application sous qtCreator, pour faire simple, voici ce que je souhaite faire :
    -Il y a un bouton sur ma fenêtre qt qui se nomme pushButton_Rec, j'ai faits une fonction "void MainWindow:n_pushButton_clicked() { }" ce qui me permet de rentrer dans cette fonction dès que je clique sur le ce bouton. Ensuite je souhaite qu'une fois rentré dans cette fonction, il y est une attente d'une action (d'un clique gauche de la souris). J'ai vu et testé beaucoup de solution sur internet mais à chaque fois ces solutions me permettaient de faire fonctionner mon attente que si le clique était sur l'application et ces solutions me renvoyaient la position du clique.

    Or je ne souhaite pas récupérer la valeur du clique mais simplement savoir si oui ou non l'utilisateur à fait un clique gauche, et ce partout sur l'écran et donc pas seulement sur mon application...

    Voici le peu de code que j'ai réalisé :
    Code:
    void MainWindow::on_pushButton_Rec_clicked()
    {
        if (Qt::LeftButton==1)
        {
            qDebug()<<"dans la boucle";
         }
    }
    Mon qDebug() me permet d'écrire "dans la boucle" dans la sortie de mon application si cela fonctionne et le programme que je viens d'exposer ne fonctionne seulement que si je fais le clique gauche sur le bouton Rec...

    Avez-vous une solution pour savoir quand le clique gauche de ma souris est fait et pas seulement sur mon application, sans récupérer la position du clique sur l'écran ?

    Merci d'avance pour vos réponses,
    Cordialement,
    Vincent. D

    -----

  2. #2
    Chanur

    Re : C++ Attente d'un clique gauche

    C'est une curieuse idée : ce n'est absolument pas standard.
    Le principe de la souris, c'est qu'on clique sur quelque chose. Et c'est l'objet (icône, fenêtre, barre d'outils ou autre) qui reçoit le clic.

    C'est a priori le système qui distribue les évènement vers les différents programmes en cours.
    Si j'ai bien compris, ce que tu veux c'est contourner ce fonctionnement, pour qu'un programme reçoive les clics adressés aux autres. Que si on clique sur une autre fenêtre, elle n'en soit pas informée mais que ce soit la tienne qui le soit.

    La seule façon que je vois de le faire serait d'ouvrir une fenêtre invisible qui couvre tout l'écran et qui intercepterait effectivement tous les clics ...

    Mais pourquoi n'utilises-tu pas le clavier ? Les évènements du clavier sont dirigés vers l'application qui a le "focus", c'est à dire la tienne (sauf si tu décides explicitement le contraire).
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  3. #3
    Ikhar84
    Animateur Informatique

    Re : C++ Attente d'un clique gauche

    Bonsoir,
    Il y a deux moyens pour intercepter les evenements souris et clavier:
    - un fenêtre plein ecran transparente
    - les "hook"

    Tout dépend du langage et du système hôte bien sûr...

  4. #4
    azad

    Re : C++ Attente d'un clique gauche

    Personnellement, je ne vois pas où est le problème.
    Tout est évènement, un clic dans un objet quelconque génère un évènement qui peut être «*trapé*» Les IDE (je ne connais pas qtcreator ont généralement des options pour créer un nouvel évènement dans un objet appartenant à une classe capable de générer des events.
    Si la fenêtre dans laquelle se trouve ton bouton est elle-même capable de reconnaître l’event (Qt:: LeftButton) alors il suffit de mettre dans le script associé à cette fenêtre le Trap qui sur l’event Qt::LeftButton envoie au bouton un clic gauche.
    Et cela devrait être vrai pour n’importe quel objet, même situé dans une autre fenêtre.

  5. A voir en vidéo sur Futura
  6. #5
    sandrecarpe

    Re : C++ Attente d'un clique gauche

    Salut,
    Tu peux voir du côté des hooks comme proposé plus haut :
    http://tcharles.developpez.com/simul/

  7. #6
    Eroos

    Re : C++ Attente d'un clique gauche

    Citation Envoyé par Chanur
    Si j'ai bien compris, ce que tu veux c'est contourner ce fonctionnement, pour qu'un programme reçoive les clics adressés aux autres. Que si on clique sur une autre fenêtre, elle n'en soit pas informée mais que ce soit la tienne qui le soit.
    Merci pour la réponse, je souhaite que la fenêtre qui reçoit le clic soit informé mais que mon application sache qu'il y a eu un clic sans savoir où j'ai cliqué et sur quelle application. Car je développe un petit système pour une boîte de robotique et ce système comporte deux applications qui ont tous deux un bouton start et ce bouton doit être lancé en même temps J'ai donc décidé que celle que je développe (car oui il y a un logiciel et une application et je ne développe que l'application) attende un clic de la souris qui vient de n'importe ou (bien sûr il faudra lancer cette attente du clic pour ne pas restreindre l'utilisateur en l'empêchant de cliquer n'importe ou) pour démarrer et l'autre qui n'est pas moi qui l'est développé qui recevra un appuie sur son bouton start de façon tout à fait normal.

    Citation Envoyé par Ikhar84
    Bonsoir,
    Il y a deux moyens pour intercepter les evenements souris et clavier:
    - un fenêtre plein ecran transparente
    - les "hook"
    Merci pour ces indications mais avant de me lancer sur un écran transparent, sais-tu si en cliquant sur une autre application cette fenêtre ne va pas empêchant à l'application visée de recevoir le réel clique ?

    Citation Envoyé par azad
    Personnellement, je ne vois pas où est le problème.
    Tout est évènement, un clic dans un objet quelconque génère un évènement qui peut être «*trapé*» Les IDE (je ne connais pas qtcreator ont généralement des options pour créer un nouvel évènement dans un objet appartenant à une classe capable de générer des events.
    Si la fenêtre dans laquelle se trouve ton bouton est elle-même capable de reconnaître l’event (Qt:: LeftButton) alors il suffit de mettre dans le script associé à cette fenêtre le Trap qui sur l’event Qt::LeftButton envoie au bouton un clic gauche.
    Et cela devrait être vrai pour n’importe quel objet, même situé dans une autre fenêtre.
    Merci pour la réponse, le problème justement est que la fenêtre qtcreator en question ne reçois aucune donnée si le clic se trouve en dehors de celle-ci. Et l'autre application qui va recevoir le clic en question justement, ce n'est pas moi qui l'est développé et je n'ai donc pas accès à son code, elle ne peut donc pas me renvoyer quelque chose lorsqu'elle reçoit un clique gauche.

    Citation Envoyé par sandrecarpe
    Salut,
    Tu peux voir du côté des hooks comme proposé plus haut :
    http://tcharles.developpez.com/simul/
    Merci pour le lien mais à première vue, cela ne fonctionne que sur windows, non ? Car mon application sera lancée sur linux (raspberry pi).

  8. #7
    Chanur

    Re : C++ Attente d'un clique gauche

    Citation Envoyé par Eroos Voir le message
    Merci pour la réponse, je souhaite que la fenêtre qui reçoit le clic soit informé mais que mon application sache qu'il y a eu un clic sans savoir où j'ai cliqué et sur quelle application. Car je développe un petit système pour une boîte de robotique et ce système comporte deux applications qui ont tous deux un bouton start et ce bouton doit être lancé en même temps J'ai donc décidé que celle que je développe (car oui il y a un logiciel et une application et je ne développe que l'application) attende un clic de la souris qui vient de n'importe ou (bien sûr il faudra lancer cette attente du clic pour ne pas restreindre l'utilisateur en l'empêchant de cliquer n'importe ou) pour démarrer et l'autre qui n'est pas moi qui l'est développé qui recevra un appuie sur son bouton start de façon tout à fait normal.
    Donc j'ai bien fait de préciser ce que j'avais cru comprendre : je me trompais.


    Citation Envoyé par Eroos Voir le message
    Merci pour ces indications mais avant de me lancer sur un écran transparent, sais-tu si en cliquant sur une autre application cette fenêtre ne va pas empêchant à l'application visée de recevoir le réel clique ?
    Non, justement : seule la fenêtre transparente recevrais le clic.


    Citation Envoyé par Eroos Voir le message
    Merci pour la réponse, le problème justement est que la fenêtre qtcreator en question ne reçois aucune donnée si le clic se trouve en dehors de celle-ci. Et l'autre application qui va recevoir le clic en question justement, ce n'est pas moi qui l'est développé et je n'ai donc pas accès à son code, elle ne peut donc pas me renvoyer quelque chose lorsqu'elle reçoit un clique gauche.
    Je vois bien le problème, mais personnellement je n'ai aucune solution.
    Néanmoins, je sais qu'il est possible de simuler un clic souris : VNC sait le faire.
    Peut-être que ta fenêtre transparente peut le faire de la même façon, je ne sais pas. En tout cas, ça risque d'être une usine à gaz ...
    Dernière modification par JPL ; 06/06/2017 à 22h25. Motif: Correction de la balise Quote
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  9. #8
    Ikhar84
    Animateur Informatique

    Re : C++ Attente d'un clique gauche

    La fenêtre "transparente" est la solution passe partout, cela semble fonctionner car à partir d'une certaine transparence, il n'y a plus interaction...

    Mais la méthode la plus propre reste le hook, qui existe bien sous linux.
    C'est le moyen utilisé par les keylogger et autres RAT...

    Il existe aussi d'autre moyens mais bien plus complexes...

  10. #9
    Eroos

    Re : C++ Attente d'un clique gauche

    Bonjour,

    Merci pour vos conseils, je me suis donc renseigné sur les hooks car en effet cela me paraît être une solution plus "propre".
    J'ai donc suivis ce lien qui explique à peu près tout sur les hooks sur linux (et peut-être sur windows également mais je n'ai pas regardé ça en détail) :
    ftp://ftp-developpez.com/buffa/xwindow/xwindow.pdf

    A la page 38 (jusqu'à la page 41), la programmation est expliqué et je me suis basé sur ça pour tenté de réaliser ce petit programme en c++ sur qtcreator :

    Code:
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <X11/X.h>
    #include <X11/Xlib.h>
    #include <QDebug>
    #include <qtextstream.h>
    #include <QTextStream>
    
    typedef union _XEvent {
        int type;
        XButtonEvent xbutton;
    }XEvent;
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        if (ButtonPress==1)
        {
            if (Button1==1)
            {
                qDebug()<<"boutton pressé !";
            }
        }
    }
    Je souhaite à travers ces quelques lignes de code savoir si un clique à été produit ou non.
    Voici les erreurs que j'obtient et qui m'empêche de lancer mon application :

    /usr/include/arm-linux-gnueabihf/qt5/QtCore/qtextstream.h:54: error: #error qtextstream.h must be included before any header file that defines Status
    #error qtextstream.h must be included before any header file that defines Status
    ^

    /usr/include/arm-linux-gnueabihf/qt5/QtCore/qtextstream.h:80: error: expected identifier before 'int'
    enum Status {
    ^

    /usr/include/arm-linux-gnueabihf/qt5/QtCore/qtextstream.h:80: error: expected unqualified-id before '{' token
    enum Status {
    ^

    /home/pi/programme/Vincent.D/Programme/MyMaps/test_clique/mainwindow.cpp:9: error: redefinition of 'union _XEvent'
    typedef union _XEvent {
    ^

    /usr/include/X11/Xlib.h:985: error: previous definition of 'union _XEvent'
    typedef union _XEvent {
    ^

    /home/pi/programme/Vincent.D/Programme/MyMaps/test_clique/mainwindow.cpp:12: error: invalid type in declaration before ';' token
    }XEvent;
    ^

    /home/pi/programme/Vincent.D/Programme/MyMaps/test_clique/mainwindow.cpp:12: error: conflicting declaration 'typedef int XEvent'


    Voila, je reviens vers vous pour savoir si vous avez des solutions à ces erreurs ou si vous avez des indications à me donner pour tenter d'améliorer mon programme pour peut-être permettre de le faire fonctionner !

    Merci,
    Cordialement,
    Vincent. D

  11. #10
    Chanur

    Re : C++ Attente d'un clique gauche

    Faute d'avoir ton mainwindow.h, je ne peux pas le compiler.
    Mais la première erreur te dis que qtextstream.h devrait être inclus avant un autre (sans qu'on sache lequel).

    As-tu essayé de mettre tes "include" dans le bon ordre : commencer par les plus généraux (en l'occurence qtextstream.h, semble-t-il) et finir par les plus particuliers (mainwindows.h et ui_mainwindows.h)

    En passant, tu es sûr qu'il y a besoin d'inclure des choses d'aussi bas niveau que les X11 ?

    [edit : ça donnerait ça :]
    Code:
    #include <qtextstream.h>
    #include <QTextStream>
    #include <QDebug>
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    //#include <X11/X.h>
    //#include <X11/Xlib.h>
    Dernière modification par Chanur ; 08/06/2017 à 11h53.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

Discussions similaires

  1. Pb fenêtre qui s'ouvre à chaque clique gauche
    Par jequinoxe dans le forum Sécurité et malwares : désinfectez votre machine
    Réponses: 10
    Dernier message: 09/10/2016, 17h03
  2. Clique droit souris
    Par yohann2008 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 23/03/2012, 09h42
  3. javascript on clique besoin d'aide
    Par johny005 dans le forum Programmation et langages, Algorithmique
    Réponses: 6
    Dernier message: 13/11/2011, 08h35
  4. double clique automatique
    Par delphi_jb dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 08/01/2009, 12h30
  5. pb double-clique
    Par invite78adceb2 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 23/04/2007, 19h21