Partage
  • Partager sur Facebook
  • Partager sur Twitter

[VB.net]Programme détectant périphériques USB

Code pour détecter un périphérique USB

Sujet résolu
    27 février 2013 à 17:39:13

    Bonsoir,

    J'ai un projet à réaliser en VB.net qui consiste à détecter l'insertion d'un périphérique de stockage de masse USB.

    Je n'ai aucune idée de la façon de le faire mais j'ai trouvé un bout de code :

    Imports System.Runtime.InteropServices
    
    Public Class Form1
        Dim Reponse As VbMsgBoxResult
        Private Const WM_DEVICECHANGE As Integer = &H219
        Private Const DBT_DEVICEARRIVAL As Integer = &H8000
        Private Const DBT_DEVTYP_VOLUME As Integer = &H2
    
        Public Structure DEV_BROADCAST_HDR
            Public dbch_size As Int32
            Public dbch_devicetype As Int32
            Public dbch_reserved As Int32
        End Structure
    
        Private Structure DEV_BROADCAST_VOLUME
            Public dbcv_size As Int32
            Public dbcv_devicetype As Int32
            Public dbcv_reserved As Int32
            Public dbcv_unitmask As Int32
            Public dbcv_flags As Int16
        End Structure
    
        Private Function GetDriveLetterFromMask(ByRef Unit As Int32) As Char
            For i As Integer = 0 To 25
                If Unit = (2 ^ i) Then
                    Return Chr(Asc("A") + i)
                End If
            Next
        End Function
    
        Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
            If m.Msg = WM_DEVICECHANGE Then
                If CInt(m.WParam) = DBT_DEVICEARRIVAL Then
                    Dim DeviceInfo As DEV_BROADCAST_HDR
                    DeviceInfo = DirectCast(Marshal.PtrToStructure(m.LParam, GetType(DEV_BROADCAST_HDR)), DEV_BROADCAST_HDR)
                    If DeviceInfo.dbch_devicetype = DBT_DEVTYP_VOLUME Then
                        Dim Volume As DEV_BROADCAST_VOLUME
                        Volume = DirectCast(Marshal.PtrToStructure(m.LParam, GetType(DEV_BROADCAST_VOLUME)), DEV_BROADCAST_VOLUME)
                        Dim DriveLetter As String = (GetDriveLetterFromMask(Volume.dbcv_unitmask) & ":\")
                        If IO.File.Exists(IO.Path.Combine(DriveLetter, "Sauvegarde.txt")) Then
                            Reponse = MsgBox("Voulez vous sauvegarder votre clé USB?", vbYesNo, "Sauvegarde USB?")
                        Else
    
                        End If
                    End If
                End If
            End If
            MyBase.WndProc(m)
            If Reponse = vbYes Then
                Call MsgBox("OUI appuye")
            Else
                Call MsgBox("NON appuye")
            End If
        End Sub
    End Class
    



     Ce code permet de poser une question avec un choix OUI/NON, si un fichier nommé Sauvegarde.txt est trouvé à la raçine du périphérique.

    Franchement : Je ne comprends rien à ce code, je l'ai trouvé (mais je sais le modifier et ajouter certaines choses)

    Je voudrais savoir si il existe un code plus simple.

    Moi mon but est juste de :

    Vérifier si un périphérique de stockage se connecte

    Demander à l'utilisateur si il veut le sauvegarder

    Copier tout du périphérique vers le PC

    -
    Edité par Kermite79 27 février 2013 à 17:39:45

    • Partager sur Facebook
    • Partager sur Twitter
      28 février 2013 à 10:18:59

      Je garde ce code finalement.
      • Partager sur Facebook
      • Partager sur Twitter
        16 novembre 2016 à 13:43:48

        Ce code est bizard Je ne compendre absolument rein, aidez moi a le compendre svp

        -
        Edité par JoelAmbu 16 novembre 2016 à 13:45:59

        • Partager sur Facebook
        • Partager sur Twitter
          16 novembre 2016 à 14:26:47

          Quelles parties plus précisément ?
          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            16 novembre 2016 à 23:35:23

            JoelAmbu a écrit:

            Ce code est bizard Je ne compendre absolument rein, aidez moi a le compendre svp


            Je vais tenter d'expliquer ce code ou tout au moins le principe.

            Donc on veut savoir quand un disque (ou clé) USB se branche sur un poste, Windows envoie le message WM_DEVICECHANGE quand il y a un changement au niveau des périphériques, d'où la nécessité de réécrire WndProc pour capter ce message.

            WParam permet de préciser le type de changement intervenu, sur cette page, on retrouve les différentes valeur de WParam.

            Ici ce qui nous intéresse c'est de savoir quand un périphérique USB est branché et pour cela WParam doit être égale à DBT_DEVICEARRIVAL.

            On a besoin ensuite de récupérer des infos par rapport à ce périphérique et c'est là qu'il manque quelque-chose dans le code.

            LParam doit nous retourner une structure qui va nous permettre d'avoir des infos sur le périphérique, mais on doit préciser quelle structure on veut récupérer et pour cela on utilise RegisterDeviceNotification, plus d'information sur cette fonction ICI.

            RegisterDeviceNotification doit être appelée à la création de la form, il retourne un pointeur qu'on utilisera avec la fonction  UnregisterDeviceNotification qui doit être appelée à la destruction de la form.

            Quelques précisions pour RegisterDeviceNotification:

            • hRecipient est le handle de la forme qui va capter les messages Windows
            • NotificationFilter est un pointeur sur une variable de type DEV_BROADCAST_VOLUME (cette structure permettra de retrouver le lecteur du périphérique de stockage USB), il faut initialiser dbcv_size (taille de la structure) et dbcv_devicetype à DBT_DEVTYP_VOLUM
            • flag prendra comme valeur DEVICE_NOTIFY_WINDOWS_HANDLE

            Bon je résume:

            • on a précisé l'info qu'on veut récupérer avec RegisterDeviceNotification
            • dans WndProc, on va uniquement s'intéresser au message WM_DEVICECHANGE
            • à l'aide de WParam on s'intéresse uniquement aux appareils branchés
            • LParam nous fournit une structure de type DEV_BROADCAST_VOLUME

            A ce stade, on peut aussi bien détecter le branchement d'une souris, d'une webcam, de son smartphone, tout appareil se branchant via USB.

            On va donc vérifier à l'aide de la structure retournée, si c'est bien un périphérique USB de stockage, dbcv_devicetype doit être égale à DBT_DEVTYP_VOLUME et là on est sur de notre coup.

            Maintenant qu'on a détecter le branchement d'un périphérique USB de stockage, retrouvons le lecteur afin de réaliser l'action souhaitée ,copie de données (je ne m'étalerai pas sur comment faire cette action).

            La structure DEV_BROADCAST_VOLUME a une propriété dbcv_unitmask, c'est le lecteur, mais il retourne un nombre, 1, 2, 4, 8, 16, 32, enfin vous avez compris, ce nombre aura la valeur 2 puissance n, pour 1 c'est le lecteur A, pour 2 -> B, 4 -> C et ainsi de suite.

            Dans le code fourni par Kermit79, la méthode GetDriveLetterFromMask va recherche la valeur de n et donc retrouver la lettre, on aurait pu se servir de log2 pour retrouver n.

            J'ai fait du VB, mais il y a longtemps dans ma jeunesse, c'est pour cela que je ne donne pas de code, mais j'ai surtout voulu répondre à JoelAmbu qui voulait comprendre le code, qui comme on peut le voir, il manque une partie, enfin j'espère que mes explications sont assez claires.

             S'il faut simplifier, il faut enlever:

            DeviceInfo = DirectCast(Marshal.PtrToStructure(m.LParam, GetType(DEV_BROADCAST_HDR)), DEV_BROADCAST_HDR)

            Et cela n'a pas vraiment de sens, on jongle entre 2 types de structures alors qu'on ne peut utilise que DEV_BROADCAST_VOLUME (ou alors j'ai pas compris ce que VB pouvait faire avec cette instruction)

            • Partager sur Facebook
            • Partager sur Twitter
              17 novembre 2016 à 17:39:46

              Merci pour votre eclairesissement!!!! La je vois claire maintenant

              • Partager sur Facebook
              • Partager sur Twitter

              [VB.net]Programme détectant périphériques USB

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown