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

WinDev Discussion :

Capter les évènements Windows liés au branchement d'un disque amovible


Sujet :

WinDev

  1. #1
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut Capter les évènements Windows liés au branchement d'un disque amovible
    Bonjour à tous,

    Je sais qu'il est possible de capter l'évènement qui arrive lors de l'insertion d'une clé usb (API("USER32", "RegisterWindowMessageA", "QueryCancelAutoplay")).
    Grâce à cela j'ai la possibilité de ne pas afficher la fenêtre qui demande quoi faire lors de l'insertion d'un disque amovible.

    J'aimerais maintenant savoir s'il est possible de capter les messages suivants:
    - Exemple pour une clé usb qui a été "arrachée" (non retirée correctement) : Un message proposant l'analyse et la réparation de la clé apparait. Je souhaiterais ne pas avoir ce message.
    - Avec la fonction USBDéconnecte, un message "popup" windows apparait pour indiquer qu'il est possible de retirer la clé. J'aimerais savoir s'il est possible d'avoir un retour sur usbdeconnecte(). Et s'il est possible de dire à windows de ne pas afficher ce popup ?

    Merci d'avance.
    Google est ton ami !

  2. #2
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Je pense que tu as plus ou moins répondu à ta question : il faut passer par les API. C'est du système "pur".
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  3. #3
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Effectivement ^^

    Mais j'ai justement créé ce post pour savoir si quelqu'un avait déjà fait cela car j'ai beaucoup de mal pour trouver les appels qu'ils faut faire à l'API....
    Google est ton ami !

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Il faut créer un thread avec une fenêtre masquée (dans le code du projet) qui ne fait rien d'autre que d'attendre pour le message WM_DEVICECHANGE, et utiliser RegisterDeviceNotification lors de la création de la fenêtre masquée.

    Pour plus d'informations à ce sujet, veuillez consulter le lien Device Events sur MSDN.

    ...

  5. #5
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Bonjour Patrice et merci pour ton aide.

    Après lecture de la page MSDN je rencontre des problèmes pour implémenter tout cela sous Windev.... J'essaie de transformer l'exemple fourni (c++) en w-langage mais je mis perd (https://msdn.microsoft.com/fr-fr/lib...(v=vs.85).aspx)

    Auriez-vous le temps pour m'aiguiller un peu sur la procédure à mettre en place pour s'abonner à ce service de notification ?
    Google est ton ami !

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Le lien que vous référencez ne marche pas.

    L'idée, c'est de créer une fenêtre qui dispose de sa propre pompe de message, comme dans l'exemple "MIDI Piano" que j'ai publié il y a peu en code WinDev.

    Vous pouvez reprendre tout le code, en ne gardant dans WndProc que le traitement des événements et passer tous les autres messages à la fonction par défaut de Windows à savoir: DefWindowProc.

    La fenêtre elle-même (de type POPUP et HIDDEN) peut être vide avec une largeur et une hauteur de zéro, elle doit fonctionner dans un thread pour ne pas perturber le fonctionnement de l'application WinDev proprement dite.

    ...

  7. #7
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    J'ai modifié mon message précédent pour faire fonctionner le lien. J'avais mis le caractère ")" dans l'url....

    J'ai encore l'exemple MIDIPiano sur mon poste donc je vais pouvoir regarder tout de suite.

    J'ai bien compris le système a mettre en place. Mon problème vient surtout de l'appel à l'api (le code à écrire ^^)...
    Google est ton ami !

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    95% des API dont vous avez besoin sont déjà encapsulées dans la procédure globale FlatAPI du projet MIDIpiano.

    ...

  9. #9
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    si tu veux intercepter les messages WM_DEVICECHANGE dans une de tes fenêtres windev il suffit que tu mettes dans le code d'initialisation de la fenêtre, un code du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // 0x219 = WM_DEVICECHANGE
    Evénement(ProcGestionEvenement, MoiMême,0x0219)
    avec une procédure ProcGestionEvenement du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PROCEDURE ProcGestionEvenement(MessageWindows, wParam, lParam)
    Trace("DeviceChange")
    // code de traitement du message
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  10. #10
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Bonjour Jurrassic Pork,

    Comment as-tu trouvé ce "0x0219" ?
    Google est ton ami !

  11. #11
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    ici par exemple
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  12. #12
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Merci beaucoup pour votre aide ! Je vais tester tout cela. Je reviendrais faire un retour.
    Google est ton ami !

  13. #13
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Bon je viens de tester ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Evénement(:ChangeDevice,MoiMême, 0x0219)
    Les messages sont bien captés, je peux identifier l'action. Par contre je n'arrive pas à bloquer les infosbulles de windows... Par exemple lors d'une éjection de clé usb, une infobulle apparait avec la phrase "le périphérique peut être débrancher blablabla..." Or c'est justement cette infobulle que je voudrais masquer.

    Je n'ai pas encore réussi à utiliser la fonction RegisterDeviceNotification()...

    Ce que dit la doc :

    HDEVNOTIFY WINAPI RegisterDeviceNotification(
    _In_ HANDLE hRecipient,
    _In_ LPVOID NotificationFilter,
    _In_ DWORD Flags
    );

    https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

    Donc moi je fais ceci en Windev :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    API("USER32", "RegisterDeviceNotificationA", HandleDeMaFenetre, ????? ,0x00000000) // ou 0x00000000 = DEVICE_NOTIFY_WINDOW_HANDLE
    Problème avec le deuxième paramètre à passer. Qui peut soit être un DBT_DEVTYP_DEVICEINTERFACE, soit un DBT_DEVTYP_HANDLE. En partant sur la première option la doc nous dit :

    typedef struct _DEV_BROADCAST_HDR {
    DWORD dbch_size;
    DWORD dbch_devicetype;
    DWORD dbch_reserved;
    } DEV_BROADCAST_HDR, *PDEV_BROADCAST_HDR;


    Il faut alors créé une structure windev DEV_BROADCAST_HDR comme indiqué ci-dessus. Instancié une variable de cette structure afin de la passer à l'appel à l'API.
    Par contre je ne sais pas quoi mettre comme valeur à l'initialisation de cette variable....

    Donc à ce moment là je me demande déjà si faire marché RegisterDeviceNotification me permettra de régler mon problème d'infobulle. Car en captant le message avec la première méthode j'ai la notification mais pas la main pour lui dire de ne pas afficher le message. Est-ce que le register me permettra de le faire ça je ne sais pas....

    Personne n'a déjà réalisé ceci ?
    Google est ton ami !

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Voir le lien ci-dessous
    BassBox
    et regardez le code de WM_DEVICECHANGE

    Concernant les 2 structures DEV_BROADCAST_HDR et DEV_BROADCAST_VOLUME
    voici leur transposition en code WinDev
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DEV_BROADCAST_HDR is structure
      dbch_size       is 4-byte unsigned int
      dbch_devicetype is 4-byte unsigned int
      dbch_reserved   is 4-byte unsigned int
    END
     
    DEV_BROADCAST_VOLUME is structure
      dbch_size       is 4-byte unsigned int
      dbch_devicetype is 4-byte unsigned int
      dbch_reserved   is 4-byte unsigned int
      dbcv_unitmask   is 4-byte unsigned int
      dbcv_flags      is 2-byte unsigned int
    END
    Vous devez assigner le parametre dbch_size de chaque structure de la façon suivante:

    DevHDR is DEV_BROADCAST_HDR
    DevHDR.dbch_size = Dimension(DevHDR)

    DevVOL is DEV_BROADCAST_VOLUME
    DevVOL.dbch_size = Dimension(DevVOL)

    et passer un pointeur sur chaque structure, avec &DevHDR et &DevVOL.

    ...

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/10/2013, 23h40
  2. Réponses: 1
    Dernier message: 05/04/2011, 11h48
  3. Réponses: 0
    Dernier message: 11/12/2010, 12h58
  4. [C#] Timer sur les évènements des messages Windows
    Par Nullos Oracle dans le forum Windows Forms
    Réponses: 1
    Dernier message: 19/09/2006, 11h33
  5. [API windows] Récupérer proprement les évènements clavier...
    Par heider dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 20/03/2006, 13h05

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