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

Composants VCL Delphi Discussion :

Composant détectant l'insertion d'une clé USB


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut Composant détectant l'insertion d'une clé USB
    Bonsoir,

    Une idée m'est venue à l'esprit, c'est de faire un composant qui me permettrait de récupérer un peu tout ce dont j'ai besoin lorsqu'une clé USB est insérer.

    Pour celà, j'avais vu sur ce forum un morceau de code qui permettait de détecter l'insertion ou le retrait de clé usb, CDROM ...

    Sans utiliser le composant, j'arrive à récupérer correctement mes informations par contre, je n'y arrive pas en passant par ce dernier ...

    Voici mon code :

    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
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    unit UMedia;
     
    interface
     
    uses Windows,Messages,Classes,SysUtils,Dialogs;
     
    const
      DBT_DEVICEARRIVAL          = $8000;          // system detected a new device
      DBT_DEVICEREMOVECOMPLETE   = $8004;          // device is gone
      DBT_DEVTYP_VOLUME          = $00000002;      // device volume class
     
     
    type
      PDevBroadcastHdr  = ^DEV_BROADCAST_HDR;
      PDevBroadcastHeader  = PDevBroadcastHdr;
      DEV_BROADCAST_HDR = packed record
        dbch_size: DWORD;
        dbch_devicetype: DWORD;
        dbch_reserved: DWORD;
    end;
     
      PDevBroadcastVolume        =  ^DEV_BROADCAST_VOLUME;
      DEV_BROADCAST_VOLUME      =  packed record
         dbch_size:              DWORD;
         dbch_devicetype:        DWORD;
         dbch_reserved:          DWORD;
         dbcv_unitmask:          DWORD;
         dbcv_flags:             WORD;
    end;
     
    type TMediaConnected = class(TComponent)
      private
        LettreLecteur:char;
        VolName     : Array[0..Max_Path]Of Char;
        FileSysName : Array[0..Max_Path]Of Char;
        VolSerial   : DWord;
        FileMaxLen  : DWord;
        FileFlags   : DWord;
        EspaceLibre : double;
        EspaceTotal : double;
        EspaceOccupe: double;
        procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
      public
        function GetSerialVolume:Cardinal;
        function GetNameVolume:String;
        function GetFreeSpace(TypeSizeReturn:String='octet'):double;
        function GetBusySpace(TypeSizeReturn:String='octet'):double;
        function GetSpace(TypeSizeReturn:String='octet'):double;
        function GetLetterMedia:char;
     
    end;
     procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('Media',[TMediaConnected]);
    end;
     
    procedure TMediaConnected.WMDeviceChange(var Msg: TMessage);
    var
    PHeader : PDevBroadcastHeader;
    PData : PDevBroadcastVolume;
    Index : Integer;
     
    begin
    inherited;
      PHeader:=PDevBroadcastHeader(Msg.lParam);
      LettreLecteur:=#0;
      case Msg.WParam of
        DBT_DEVICEARRIVAL :
        begin
          if (PHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
          begin
            PData:=PDevBroadcastVolume(Msg.lParam);
            for Index:=0 to 25 do
            if ((PData^.dbcv_unitmask shr Index) = 1) then
            begin
              LettreLecteur:=Chr(65+Index);
              break;
            end;
              If GetVolumeInformation(PChar(LettreLecteur+':\'),VolName,Max_Path,@VolSerial, FileMaxLen, FileFlags,FileSysName,Max_Path) then
              begin
              EspaceLibre:=DiskFree(Ord(LettreLecteur)-64);
              EspaceTotal:=DiskSize(Ord(LettreLecteur)-64);
              EspaceOccupe:=EspaceTotal-EspaceLibre;
              end;
          end;
        end;
     
        DBT_DEVICEREMOVECOMPLETE:
        begin
          if (PHeader^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
          begin
            PData:=PDevBroadcastVolume(Msg.lParam);
            for Index:=0 to 25 do
            if ((PData^.dbcv_unitmask shr Index) = 1) then
            begin
              LettreLecteur:=Chr(65+Index);
              break;
            end;
          end;
        end;
      end;
    end;
     
    function TMediaConnected.GetSerialVolume:cardinal;
    begin
      Result:=VolSerial;
    end;
     
    function TMediaConnected.GetNameVolume:string;
    begin
      Result:=VolName;
    end;
     
    function TMediaConnected.GetLetterMedia:char;
    begin
      Result:=LettreLecteur;
    end;
     
    function TMediaConnected.GetFreeSpace(TypeSizeReturn:String='octet'):double;
    var
    typeOfSize:TStringList;
    begin
      typeOfSize:=TStringList.Create;
      typeOfSize.Add('Ko');
      typeOfSize.Add('Mo');
      typeOfSize.Add('Go');
      case typeOfSize.IndexOf(TypeSizeReturn) of
        0: Result:=EspaceLibre / 1024;
        1: Result:=EspaceLibre / 1048576;
        2: Result:=EspaceLibre / 1073741824;
        else
          Result:=EspaceLibre;
      end;
      typeOfSize.Free;
    end;
     
    function TMediaConnected.GetBusySpace(TypeSizeReturn:String='octet'):double;
    var
    typeOfSize:TStringList;
    begin
      typeOfSize:=TStringList.Create;
      typeOfSize.Add('Ko');
      typeOfSize.Add('Mo');
      typeOfSize.Add('Go');
      case typeOfSize.IndexOf(TypeSizeReturn) of
        0: Result:=EspaceLibre / 1024;
        1: Result:=EspaceLibre / 1048576;
        2: Result:=EspaceLibre / 1073741824;
        else
          Result:=EspaceLibre;
      end;
      typeOfSize.Free;
    end;
     
    function TMediaConnected.GetSpace(TypeSizeReturn:String='octet'):double;
    var
    typeOfSize:TStringList;
    begin
      typeOfSize:=TStringList.Create;
      typeOfSize.Add('Ko');
      typeOfSize.Add('Mo');
      typeOfSize.Add('Go');
      case typeOfSize.IndexOf(TypeSizeReturn) of
        0: Result:=(EspaceTotal - EspaceLibre) / 1024;
        1: Result:=(EspaceTotal - EspaceLibre) / 1048576;
        2: Result:=(EspaceTotal -EspaceLibre) / 1073741824;
        else
          Result:=EspaceTotal -EspaceLibre;
      end;
      typeOfSize.Free;
    end;
    end.
    Est-ce possible de récupérer les infos de cette manière ou dois-je obligatoirement passer par la méthode standard, c'est à dire ne pas créer de composant ?

    Merci pour votre aide

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 154
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 154
    Par défaut
    Salut !

    j'avais vu sur ce forum un morceau de code qui permettait de détecter (...)
    Pas trouvé... Tu le mets en œuvre comment, ton bazar ?
    --
    jp

  3. #3
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Re-Bonsoir,

    Je vais essayer d'être plus explicite ...

    J'ai utilisé le code provenant de ce topic :

    http://www.developpez.net/forums/sho...d.php?t=121998

    Mon idée, c'était de faire un composant (non visuel donc comme par exemple les OpenDialogs) qui me permettrait de mettre en oeuvre de façon simple la détection de clé USB lors de son insertion ou de son retrait.

    Je me suis dit que j'allais donc créer le composant à partir de la classe TComponent (j'espère d'ailleurs que je ne me trompe pas).

    Au delà du fait que je n'aperçoit pas mon composant dans la palette de Delphi après compilation de la source, je n'arrive pas à mettre en oeuvre le système de détection de clé USB via cette source...

    Lorsque je veux faire appel à mon composant, je fais ceci :
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,UMedia, StdCtrls, DB, DBTables;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Query1: TQuery;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      MonAppareilUSB:TMediaConnected;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      // Crétion de mon Objet
      MonAppareilUSB:=TMediaConnected.Create(Self);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      // Avant de cliquer sur le bouton, j'insère une clé USB pour récupérer les infos
     //Là je devrais avoir son nom de volume mais rien (de devrais avoir Mandriva)
      ShowMessage(MonAppareilUSB.GetNameVolume);
    end;
    Voilà pour les explications ...
    J'espère que c'est plus clair...
    A+

  4. #4
    Membre éclairé Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Par défaut
    Il ne te manquerait pas les méthode Create et Destroy?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      public
        { Déclarations publiques }
        constructor Create(aOwner: Tcomponent); override;
        destructor Destroy; override;
    Je n'ai pas Testé ton code encore ...

  5. #5
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Citation Envoyé par petitprince Voir le message
    Il ne te manquerait pas les méthode Create et Destroy?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      public
        { Déclarations publiques }
        constructor Create(aOwner: Tcomponent); override;
        destructor Destroy; override;
    Je n'ai pas Testé ton code encore ...
    Hé bien, je ne pense pas ... J'ai tout de même ajouter ceci :

    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
    public
        constructor Create(aOwner: Tcomponent); override;
        destructor Destroy; override;
     
    implementation
     
    Constructor TMediaConnected.Create(aOwner:TComponent);
    begin
      inherited;
    end;
     
    Destructor TMediaConnected.Destroy;
    begin
      inherited;
    end;
    Celà ne fonctionne pas tout de même

  6. #6
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut

    C'est assez spéciale l'utilisation d'un TStringList dans tes fonctions GetXXXSpace.

    Je verrais plutôt l'utilisation d'une constante énumérée:
    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
     
    type
      TTypeSizeOf = (tsoByte, tsoKiloByte, tsoMegaByte);
     
      // ...
     
    implementation
     
    function FormatSize(Value: Double; TypeSizeReturn: TTypeSizeOf): Double;
    begin
      case TypeSizeReturn of
        tsoByte:      Result := Value / 1024;
        tsoKiloByte:  Result := Value / 1048576;
        tsoMegaByte:  Result := Value / 1073741824;
        else
          Result := Value;
      end;
    end;
     
    function TMediaConnected.GetFreeSpace(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
    begin
      result := FormatSize(FFreeSpace, TypeSizeReturn);
    end;
     
    function TMediaConnected.GetBusySpace(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
    begin
      result := FormatSize(FBuzySpace, TypeSizeReturn);
    end;
     
    function TMediaConnected.GetSize(TypeSizeReturn: TTypeSizeOf = tsoByte): Double;
    begin
      result := FormatSize(FSize, TypeSizeReturn);
    end;
    [Edit]
    Dans le cas présent, je ne vois pas trop l'intérêt d'écrire un composant. Tu n'as pas de propriétés publiées, et toutes les infos sont en lecture-seule.
    Cette simple unité que tu adjoins à ton projet, cela me semble suffisant.

    @+ Claudius

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

Discussions similaires

  1. Réponses: 27
    Dernier message: 06/11/2014, 06h25
  2. Detection de l'insertion/retrait d'une clef USB
    Par blondelle dans le forum C++Builder
    Réponses: 1
    Dernier message: 04/04/2013, 10h48
  3. Désactiver le "contenu mixe" lors de l'insertion d'une clé USB
    Par AntonioDella dans le forum Windows XP
    Réponses: 1
    Dernier message: 11/01/2010, 18h32
  4. Besoin d'un composant graphique pour simple insertion d'une date
    Par baccarios dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 06/08/2009, 16h40

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