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

Windows Discussion :

Détection de la connection d'un périphérique USB sur Windows


Sujet :

Windows

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    Points : 40
    Points
    40
    Par défaut Détection de la connection d'un périphérique USB sur Windows
    Bonjour!
    Je souhaite, faire en premier lieu un module en java qui me permet la détection de l'insertion d'une clé usb qui est identifié par sa marque.
    Peut on lire les information du périphérique inséré avec java et detecter la connection et la connection du périphérique.
    Merci.

  2. #2
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    d'après les recherches effectués j'ai trouvé ces deux api:
    javax.usb: qui est encore dans la version alpha depuis deux ans!!!!!
    jUSB: c'est une DLL écrite en C++, mais il faut installer un driver et ...

    donc ces deux solutions me convient pas. J'ai eu l'idée soit:
    - Puisque j'ai besoin juste de l'information si le périphérique est connecté ou non, je peux faire une DLL en C++ contenant une fonction isConnected(), et cette DLL sera utilisé par l'applet Java.
    mais je trouve pas d'exemple comment faire la detection de connexion de l'USV, il y a WM_DEVICECHANGE mais il faut un handle sur un Window.
    - Ou encore faire la recherhe d'un disque local chaque t instant de nom correspond au périphérique souhaité (storage disk), ou encore je cherche un fichier qui sera disponible que dans le disk usb (exepmle test.ffff).

    Vos avis.

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    WM_DEVICECHANGE est la bonne méthode. C'est un message qui sera envoyé par Windows à ta fenêtre, il te faut donc créer une fenêtre. Le concept de fenêtre sous Windows est assez large, il ne s'agit par forcément d'une fenêtre mère visible à l'écran. Tu peux même te passer de fenêtre si tu bidouilles ta bouce des messages.
    Le problème dans ton cas c'est justement la boucle des messages, que Java implémente sûrement si tu crées des fenêtres, et peut être même sans. Le recours à une fenêtre Win32 me semble donc obligatoire. Si tu ne vises que Win2K et supérieurs, tu peux créer une fenêtre dédiée à la réception de messages (invisible). Lire "Message-Only Windows" ici:
    http://msdn.microsoft.com/library/en...owfeatures.asp

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    WM_DEVICECHANGE est la bonne méthode. C'est un message qui sera envoyé par Windows à ta fenêtre, il te faut donc créer une fenêtre. Le concept de fenêtre sous Windows est assez large, il ne s'agit par forcément d'une fenêtre mère visible à l'écran. Tu peux même te passer de fenêtre si tu bidouilles ta bouce des messages.
    Le problème dans ton cas c'est justement la boucle des messages, que Java implémente sûrement si tu crées des fenêtres, et peut être même sans. Le recours à une fenêtre Win32 me semble donc obligatoire. Si tu ne vises que Win2K et supérieurs, tu peux créer une fenêtre dédiée à la réception de messages (invisible). Lire "Message-Only Windows" ici:
    http://msdn.microsoft.com/library/en...owfeatures.asp
    Oui e vise seulement Win2K et supérieus.
    donc si je comprend bien, on peut faire une Window invisible qui sera dédiée à la réception des message. ça marche aussi avec une DLL?
    Connait tu un exemple sur la détection de la connexion d'un périphérique USB et l'extraction de ses informations en C++.
    Merci.

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Oui ça marche avec une dll.Faudra modifier le GetModuleHandle et le remplacer par le hModule de ta dll. Ta dll peux lancer un thread qui s'occupe d'écouter WM_DEVICECHANGE.

    Des bouts de code de ce que j'avais fait (j'avais pas utilisé de message only window finallement):
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
        const TCHAR * wnd_class_name = TEXT( "DeviceDetectionWnd" );
    
        void ClearWndStuff()
        {
            ::UnregisterClass( wnd_class_name, ::GetModuleHandle( NULL ) );
        }
    
        HWND InitWndStuff()
        {        
            WNDCLASS wc = {}; 
            wc.lpfnWndProc = ::DefWindowProc;
            wc.hInstance = ::GetModuleHandle( NULL );
            wc.lpszClassName = wnd_class_name;
    
            if ( ::RegisterClass( &wc ) == 0 )
            {
                log_error() << "Erreur RegisterClass() : " << ::GetLastError();
                return NULL;
            }
    
            HWND hWnd = ::CreateWindow(
                wnd_class_name,
                "",
                0,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                NULL,
                NULL,
                ::GetModuleHandle( NULL ),
                NULL );
    
            if ( hWnd == NULL )
            {
                ClearWndStuff();
            }
            return hWnd;
        }
    
    
        void ThreadProc()
        {
            // obtenir le GUID de la classe associée à la  caméra
            GUID guidCamera;
            if ( !GetCameraGUID( guidCamera ) )
            {
                return;
            }
    
            // créer la fenêtre pour la réception du message de notification
            // de branchement / débranchement de la caméra
            this->zhWnd = InitWndStuff();
            if ( this->zhWnd == NULL )
            {
                return;
            }
    
            // scruter les changements de configuration
            BOOL bRet;
            MSG msg;
            while( ( bRet = ::GetMessage( &msg, NULL, 0, 0 ) ) != 0 )
            { 
                if ( bRet == -1 )
                {
                    log_error() << "Erreur GetMessage() : " << ::GetLastError();
                    return;
                }
                else
                {
                    // changement dans la config hardware
                    if ( msg.message == WM_DEVICECHANGE )
                    {
                        bool new_status = IsDevicePlugged( guidCamera );
                        UpdateCameraStatus( new_status );
                    }
                }
                else if ( msg.message == WM_DESTROY )
                {
                    // destruction de la fenêtre : quitter la boucle
                    ::PostQuitMessage( 0 );
                }
                TranslateMessage( &msg ); 
                DispatchMessage( &msg ); 
            }
            }  
            // si on est sorti, c'est que la fenêtre a été détruite,
            // donc this->hWnd est invalide
            ClearWndStuff();
        }
    
        void StopThread()
        {
            // pour arrêter le thread, il suffit de fermer
            // la fenêtre : le thread s'arrêtera tout seul
            ::PostMessage(
                this->zhWnd,
                WM_CLOSE,
                0,
                0 );
        }
    bon le code est discutable car je bidouille un peu pour ne pas passer par une WndProc, et finalement économiser 3 lignes. Mais bon ça marche.

    Reste ensuite le code lié à la récupération des infos sur le device. Je ne sais pas trop ce que tu cherches à obtenir. Mais le point de départ c'est l'identifiant de la classe de périphérique USB. Ton périphérique est d'un type donné, appelé "CameraTOTO" dans le code suivant. La fonction GetCameraGUID renvoie l'identifiant système associé au nom de cette classe.

    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
        TCHAR * CameraClassName = TEXT( "CameraTOTO" );
    
        bool GetCameraGUID( GUID & CameraGuid )
        {
            DWORD nb; // nombre de GUID dispos
            if ( SetupDiClassGuidsFromName(
                    CameraClassName,
                    &CameraGuid,
                    1,
                    &nb ) != TRUE )
            {
                log_error()
                    << "Erreur SetupDiClassGuidsFromName() : " << ::GetLastError();
                return false;
            }
            // ne renvoie aucun GUID si le driver n'est pas installé
            if ( nb == 0 )
            {
                log_trace() << "Le driver n'est pas installé";
            }
            // on est censé avoir un seul GUID pour cette classe
            if ( nb > 1 )
            {
                log_error() << "Plusieurs GUID existent : " << nb;
            }
            // bizarrement, si cette classe n'est pas installée sur le système
            // l'appel à SetupDiClassGuidsFromName() réussit quand même et un GUID
            // nul est renvoyé
            // donc on test la validité du GUID obtenu
            static GUID guidNull = {};
    
            if ( ::IsEqualGUID( CameraGuid, guidNull ) )
            {
                log_error() << "Le GUID renvoyé est nul (driver non installé)";
                return false;
            }           
            // ça s'est bien passé
            return true;
        }
    Dans ton cas il faut remplacer CameraTOTO par ce qui convient ("USB" est à essayer). Tu peux aussi peut être partir d'un GUID prédéfini. Exemples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // {a5dcbf10-6530-11d2-901f-00c04fb951ed}
    DEFINE_GUID(USBSTIK_GUID,
    0xa5dcbf10, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9,
    0x51, 0xed);
    c'était pour ma clé usb je crois.

    ou encore la classe HID

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const GUID HidClassGuid = {0x4D1E55B2, 0xF16F, 0x11CF, {0x88,0xCB,0x00,0x11,0x11,0x00,0x00,0x30}};
    tu trouveras des infos sur le HID et l'USB sur pas mal de sites, et sur nos forums aussi (fait une recherche).
    http://www.lvr.com/hidpage.htm
    http://www.developpez.net/forums/sho...d.php?p=747544
    etc...

    et enfin la fonction qui testait le branchement de la caméra, spécifique à mon cas, mais qui peut peut être te servir:
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
        bool IsDevicePlugged( const GUID & CameraGUID )
        {
            HDEVINFO hDevInfo = ::SetupDiGetClassDevs(
                &CameraGUID,
                NULL,
                NULL,
                DIGCF_PRESENT );
            if ( hDevInfo  == INVALID_HANDLE_VALUE )
            {
                log_error() << "Erreur SetupDiGetClassDevs() : " << GetLastError();
                return false;
            }
    
            SP_DEVINFO_DATA dev_info = { sizeof( SP_DEVINFO_DATA ) };
            
            if ( ::SetupDiEnumDeviceInfo(
                    hDevInfo,
                    0,
                    &dev_info ) == 0 )
            {
                // aucune caméra n'est branchée
                ::SetupDiDestroyDeviceInfoList( hDevInfo );
                return false;
            }
            
            // vérifier que c'est bien la caméra attendue
            const TCHAR camera_descr[] = TEXT( "<description en anglais de la camera firewire, disponible dans le gestionnaire de périphériques entre autre>" );
            const int camera_descr_length = sizeof camera_descr / sizeof( TCHAR );
    
            DWORD unused;    
            TCHAR buffer[ camera_descr_length ];
            DWORD required_size;
    
            if ( ::SetupDiGetDeviceRegistryProperty(
                    hDevInfo,
                    &dev_info,
                    SPDRP_DEVICEDESC, 
                    &unused,
                    reinterpret_cast<PBYTE>( buffer ),
                    camera_descr_length,
                    &required_size ) != TRUE )
            {
                log_error() << "Erreur SetupDiGetDeviceRegistryProperty() : "
                    << ::GetLastError();
                ::SetupDiDestroyDeviceInfoList( hDevInfo );
                return false;
            }
            if ( required_size != camera_descr_length )
            {
                log_error() << "Mauvaise caméra";
                ::SetupDiDestroyDeviceInfoList( hDevInfo );
                return false;
            }
            if ( lstrcmp( buffer, camera_descr ) != 0 )
            {
                log_error() << "Mauvaise caméra : " << buffer;
                ::SetupDiDestroyDeviceInfoList( hDevInfo );
                return false;
            }
            // la bonne caméra est branchée
            ::SetupDiDestroyDeviceInfoList( hDevInfo );
            return true;
        }

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    Merci Aurelien.Regat-Barrel, je vais essayer ta piste.
    moi je veux juste récupérer le nom du flash disk inséré dans le ports USB (par exemple Sony strorage disk), après la détection de la connection d'un périphérique USB

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    En adaptant le code de IsDevicePlugged pour simplement récupérer la description sans la comparer, ça devrait te donner cette info.
    Mais tu n'échaperas pas au fait de devoir trouver quel est le type de périphérique (le GUID). Essaye les 2 guids que je t'ai donné.

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    En adaptant le code de IsDevicePlugged pour simplement récupérer la description sans la comparer, ça devrait te donner cette info.
    Mais tu n'échaperas pas au fait de devoir trouver quel est le type de périphérique (le GUID). Essaye les 2 guids que je t'ai donné.
    En faite j'ai trouvé dans le registe que les clé de registe de l'USB stick se trouve sous {53f56307-b6bf-11d0-94f2-00a0c91efb8b}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ##?#USBSTOR#Disk&Ven_GENERIC&Prod_USB_DISK_DEVICE&Rev_1.00#6&1c3c5401&0&USB_MASS_STORAGE_CLASS_&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
    j'ai essayé avec cette GUID mais SetupDiGetClassDevs passe avec succès alors que SetupDiEnumDeviceInfo renvoi la valeur 0

    j'ai testé aussi avec tes GUID mais ça ne marche pas


    à propos pour déclarer les GUID je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    static const GUID USBSTIK_GUID= {0xa5dcbf10, 0x6530, 0x11d2, {0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9,
    		0x51, 0xed}};
    la fonction DEFINE_GUID me cause une erreur de type ERROR LINK 2019

Discussions similaires

  1. ESXi & périphérique USB sur VM
    Par ldujard dans le forum VMware
    Réponses: 0
    Dernier message: 03/10/2013, 16h10
  2. Comportement Hub USB sur Windows 7
    Par insane1 dans le forum Périphériques
    Réponses: 5
    Dernier message: 21/06/2011, 17h11
  3. Probleme de connection avec un modem usb sur ubuntu
    Par sylvabf dans le forum Ubuntu
    Réponses: 1
    Dernier message: 07/01/2010, 17h48
  4. Réponses: 7
    Dernier message: 21/08/2009, 12h14
  5. Connection serveur CVS en SSH sur Windows
    Par cnguyen dans le forum Eclipse
    Réponses: 0
    Dernier message: 08/10/2008, 19h26

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