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

Plateformes Discussion :

Recevoir un événement lors de la connexion d'un périphérique USB [Windows]


Sujet :

Plateformes

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 17
    Points : 14
    Points
    14
    Par défaut Recevoir un événement lors de la connexion d'un périphérique USB
    Bonjour,

    Je développe actuellement une application avec Qt sous Visual Studio.

    Pour l'instant, la fenêtre principale possède un bouton "Rafraichir" qui va, une fois cliqué, regarder si un USB device a été branché. S'il le reconnait, il affiche ses informations (ici il s'agit d'un appareil photo).

    Sauf que j'aimerai recevoir l'événement de connexion de l'USB Device et ainsi pouvoir retirer mon bouton car le processus d'identification pourrait se faire tout seul. Mais comment ??

    Pouvez-vous m'aider ?

    D'avance merci.

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    D'abord, je n'utilise pas assez Qt pour savoir s'il existe un moyen de faire ça de manière portable, mais je pense que si. C'est cette solution que tu devrais adopter, si elle existe. Pour une solution spécifique à Windows, il suffit de traiter le message WM_DEVICECHANGE. Pour pouvoir traiter les messages Windows, il suffit de surcharger la fonction bool QApplication::winEventFilter(MSG *).

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Merci d'avoir pris le temps de me répondre. J'ai cherché dans l'API de Qt mais je n'ai trouvé aucune informations à ce sujet. Je vais donc traiter le message WM_DEVICECHANGE, vu que l'application ne tournera que sous windows, ça ne posera pas de problème.

    Malheureusement, je ne connais pas assez la programmation Windows pour pouvoir le faire sans un peu d'aide.

    Est-ce possible de gérer ce message dans un projet Makefile de visual studio ? Si oui, quelles classes inclurent ? Que faire ?

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Il semblerait que cette classe ne gère que les évenements liés à Qt.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    setEventFilter permet de donner une fonction qui va filtrer les message provenant de l'os WINDOWS.
    C'est à tester.

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    D'accord, je comprends.

    Mais le problème reste la fonction. J'ai trouver une aide sur le site msdn : Detecting Media Insertion or Removal. Mais je ne vois pas comment l'intégrer dans une application Qt car je ne comprends pas vraiment le code du tutorial.

    Comment faut-il intégrer ce code dans une application ?

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Désolé pour le double poste mais j'ai réussi à implémenter la fonction.

    Le problème est que la fonction doit être statique et elle est implémenté dans l'objet qui contient la fenêtre.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    #include <QFileDialog>
    #include <QMessageBox>
    #include <QCalendarWidget>
    #include <QGraphicsItem>
    #include <QGraphicsGridLayout>
    #include <QGraphicsWidget>
    #include "Window.h"
    #include "ProcessWindow.h"
    #include "EDSDK/Header/EDSDK.h"
    #include "EDSDK/Header/EDSDKTypes.h"
    #include <QAbstractEventDispatcher>
    #include <windows.h>
    #include <dbt.h>
     
    static bool isPlugged = false;
    static void myEventFilter(void *message);
     
    namespace Ui {
        class MainWindow;
    }
     
    class MainWindow : public QMainWindow {
        Q_OBJECT
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
     
    	void checkPluggedDevice();
     
    protected:
        void changeEvent(QEvent *e);
     
    private:
        Ui::MainWindow *ui;
     
        QAbstractEventDispatcher *m_EventDispatcher;
     
        void createGraphics();
     
    private slots:
        void on_modifiedButton_clicked();
        void on_validateButon_clicked();
        void on_dateEdit_dateChanged(QDate date);
        void on_comboBox_activated(int index);
        void on_actionOuvrir_un_fichier_triggered();
        void on_actionQuitter_triggered();
    };
     
    #endif // MAINWINDOW_H
    .cpp

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
     
    	/* Get the Dispatcher instace */
    	m_EventDispatcher = QAbstractEventDispatcher::instance(0);
     
    	qApp->setEventFilter((QApplication::EventFilter)/*MainWindow::*/myEventFilter);
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
     
    void myEventFilter(void *message)
    {
    MSG *msg;
     
    msg = (MSG*)message;
    PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
     
    switch(msg->wParam)
       {
    	case DBT_DEVICEARRIVAL:
    		if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
             {
    			 if (msg->message == WM_DEVICECHANGE && !isPlugged) 
    				 MainWindow::checkPluggedDevice();
    			isPlugged = true;
    		}
    		break;
    	case DBT_DEVICEREMOVECOMPLETE:
    		if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
             {
    			 if (msg->message == WM_DEVICECHANGE && isPlugged) 
    				  MainWindow::checkPluggedDevice();
    			 isPlugged = false;
    		}
    		break;
    	default:
           /*
              Process other WM_DEVICECHANGE notifications for other 
              devices or reasons.
           */ 
            ;
    	}
    }
    Or j'ai besoin que lors du branchement d'un device d'appeler la fonction membre void checkPluggedDevice(); qui accède à des attributs de la fenêtre pour la mettre à jour.

    Le problème est que j'obtiens error C2352: 'MainWindow::checkPluggedDevice'*: appel non conforme d'une fonction membre non static. Comment faire pour savoir si l'objet existe ? J'ai besoin de le mettre à jour.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/09/2008, 00h58
  2. Gestion des évènements lors d'un clique sur une image.
    Par yoghisan dans le forum Débuter
    Réponses: 7
    Dernier message: 23/06/2005, 19h04
  3. Echec lors de la connexion à la base de données.
    Par mclown dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 26/10/2004, 23h36
  4. [JSP] erreur lors d'une connexion à mySQL
    Par Jovial dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 31/08/2004, 16h48
  5. Erreur lors de la connexion
    Par mathll65 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 23/03/2004, 17h46

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