UWP et détection usb

UWP et détection usb - C#/.NET managed - Programmation

Marsh Posté le 12-07-2016 à 23:48:23    

Bonjour,
J'ai fait des recherches sur le net, j'ai trouvé une tonne d'info, j'ai compris les grandes lignes... MAIS je dois pas avoir les connaissances qu'il faut pour bien comprendre !!
Voici mon problème :
Je voudrais, au lancement de mon application, trouver une clé usb avec son nom. Si elle est présente l'application se lance sinon elle se ferme après un message d'information.
D'après ce que j'ai compris, je pourrais détecter le branchement et le débranchement d'une clé.
 
J'aurais aimé trouver un tuto "simple" ou des exemples "simple" pour construire le bout de code pour trouver ma clé et si j'y arrive bien, ajouter la détection pour que l'application ne ferme pas mais laisse la possibilité de brancher la clé.
 
Merci pour votre aide et désolé si ça parait bête mais j'ai appris tout seul et je suis parfois largué !

Reply

Marsh Posté le 12-07-2016 à 23:48:23   

Reply

Marsh Posté le 13-07-2016 à 10:22:51    

Hello,  
 
Si tu veux juste vérifier une seule fois au lancement (pas besoin de surveiller pour être notifié si la clé est branchée plus tard) et trouver une clé par son nom (en étant bien conscient que ça n'est pas une méthode fiable si c'est pour une question de sécurité), pas besoin d'API Windows ni d'UWP à mon avis, c'est ultra simple :  

Code :
  1. var drives = DriveInfo.GetDrives()
  2.                 .Where(drive => drive.IsReady && drive.DriveType == DriveType.Removable && drive.Name == "macleusb" );
  3. if(drives.Any())
  4. {
  5. // Clé trouvée
  6. blabla
  7. }
  8. else
  9. {
  10. // Clé pas trouvée
  11. Environment.Exit(1);
  12. }


Message édité par TotalRecall le 13-07-2016 à 10:23:04

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 13-07-2016 à 10:47:54    

Merci pour ta réponse. Justement avant (en WinForms) je faisais comme ça mais ça a disparu. Maintenant c'est en passant par DeviceWatcher et j'y comprends pas grand chose (surtout au niveau de comment et ou ca se construit!).
En relisant la doc MSDN la dessus, j'ai vu que MS déconseillait fortement d'utiliser le nom comme identifiant (ce que je comprends). Ils disent d'utiliser la propriété Kind et ID pour ça. Du coup je me dit que ça doit être des infos "fixe" et que si au premier lancement je demande à l'utilisateur de choisir une clé, je l'enregistre et ensuite je pointerais en priorité sur celle ci.
Dans l'idée ça m'a pas l'air insurmontable mais j'ai l'impression que tout ce que je trouve est "tordu" pour le peu que je veux faire...

Reply

Marsh Posté le 13-07-2016 à 11:06:17    

http://stackoverflow.com/questions [...] icewatcher ?

 

Et sinon tu développes pour quelle plateforme ? DriveInfo ça me parait un basique quand même, autant je comprends que WMI ou les appels natifs puissent être problématiques, autant je ne pensais pas que DriveInfo pouvait être proscrit. Même si il y a des histoires de droits et cie derrière...

Message cité 1 fois
Message édité par TotalRecall le 13-07-2016 à 11:08:14

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 13-07-2016 à 11:47:22    

Merci pour le lien. Je vais étudier ça et je te tiens au courant.
Sinon je code des app UWP pour dans le futur pouvoir faire des apps qui touchent plusieurs appareils MS (pour l'instant je me limite au desktop). Mais comme je le disait dans le premier post, je suis tout seul pour apprendre et je suis pas du tout codeur de formation (plus charpentier, en bureau d'étude mais charpentier quand même !!) du coup des fois je rame un peu (beaucoup!!) :pt1cable:

Reply

Marsh Posté le 13-07-2016 à 11:51:03    

Et pourquoi tu dis que DriveInfo "a disparu" ?
C'est une vraie question, je n'ai pas vérifié de mon côté, je ne fais pas encore d'UAP (et ça a l'air d'être un beau bordel pour certaines choses donc je ne suis pas impatient de m'y mettre..)


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 13-07-2016 à 12:34:49    


Alors j'ai regardé cet article et en fait, en UWP, System.Managment n'existe plus (commence à me casser les pieds !!)
Du coup j'ai continué mes recherches et je suis tombé la dessus : https://msdn.microsoft.com/en-us/li [...] 67756.aspx
J'ai bien suivi les étapes mais j'ai une erreur ici :

Code :
  1. async void watcher_Added(DeviceWatcher sender, DeviceInformation deviceInterface)
  2.         {
  3.             interfaces[count] = deviceInterface;
  4.             count += 1;
  5.             if (isEnumerationComplete)
  6.             {
  7.                 await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
  8.                 {
  9.                     DisplayDeviceInterfaceArray();
  10.                 });
  11.             }
  12.         }


 
Au moment du count += 1 il me dit que l'index est en dehors du tableau ("Index was outside the bounds of the array." ) et je comprends pas pourquoi. Quelqu'un aurait une idée ?

Reply

Marsh Posté le 13-07-2016 à 12:36:31    

TotalRecall a écrit :

Et pourquoi tu dis que DriveInfo "a disparu" ?
C'est une vraie question, je n'ai pas vérifié de mon côté, je ne fais pas encore d'UAP (et ça a l'air d'être un beau bordel pour certaines choses donc je ne suis pas impatient de m'y mettre..)


De ce que je comprends ils limitent les possibilités des app UWP d'aller fouiner la ou elles devraient pas. C'est pour ça aussi qu'ils ont enlevés le system.management apparement.

Reply

Marsh Posté le 13-07-2016 à 14:10:38    

Pour SystemManagement oui je comprend ça, d'ailleurs j'en parlais plus haut.  
Mais DriveInfo vient de System.IO et ce sont des objets BCL natifs, contrairement à SystemManagement qui donne accès à des objets Windows.
 
Pour ton erreur aucune idée. Pas moyen d'énumérer ça en mode synchrone et sans le côté événementiel pour avoir un truc plus simple ?


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 13-07-2016 à 16:55:34    

J'ai trouvé le bug, c'était le tableau qui était trop petit !! En gros il me liste tout (et quand je dit tout c'est tout, driver audio, processeur, affichage...) sauf que ce qui m'interesse n'apparait pas avec le nom du coup je peux pas le trouver. Je vais tester sur un autre PC au cas ou mais j'ai déjà peur du résultat !  
J'ai l'impression que le bon vieux DriveInfo était trop simple pour MS du coup c'est mieux de l'enlever !!
Si jamais quelqu'un tombe sur une extension qui permet de le récupérer ça m'interesse !!

Reply

Marsh Posté le 13-07-2016 à 16:55:34   

Reply

Marsh Posté le 13-07-2016 à 18:07:42    

Si jamais ça peut aider, je vais expliquer la finalité de mon problème. Mon App (en WinForm) actuelle s'appuie sur une base SqlCE. Cette base est stockée sur une clé USB, comme ça mon App est installée sur plusieurs PC mais j'ai juste à brancher ma clé pour avoir mes infos à jour.
Aujourd'hui je voudrais faire une App UWP avec une base SQLite. Mon utilisation étant toujours la même, je voudrais pouvoir stocker ma base sur une clé et la retrouver dans mon App. Comme ça, pas besoin de connexion internet pour avoir la dernière base vu qu'il n'y en a qu'une.

Reply

Marsh Posté le 18-07-2016 à 20:50:03    

J'ai essayé ça : https://github.com/Microsoft/Window [...] AndPairing
J'arrive avec le scenario 2 à trouver mes clé USB mais le nom qui apparaît n'est pas le nom que je leur ai donné mais le nom "d'usine" et je ne sais pas comment récupérer la lettre du lecteur choisi.
Est ce que quelqu'un a une idée ?

Reply

Marsh Posté le 20-07-2016 à 10:44:36    

J'ai trouvé une solution (par un autre forum. Pardon...)  
J'utilise KnownFolders.RemovableDevices https://msdn.microsoft.com/library/ [...] vices.aspx
Et ça marche (pour l'instant, je dois encore tester un ou deux trucs mais je trouve ma clé et je peux fouiller dedans)
Merci pour vos idées

Reply

Marsh Posté le 20-07-2016 à 11:06:59    

Merci d'être revenu pour partager tes découvertes, c'est toujours sympa pour les éventuels intéressés qui pourraient passer sur ce topic dans l'avenir avec le même souci :jap:


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 20-07-2016 à 15:28:47    

TotalRecall a écrit :

Merci d'être revenu pour partager tes découvertes, c'est toujours sympa pour les éventuels intéressés qui pourraient passer sur ce topic dans l'avenir avec le même souci :jap:


De rien je galère tellement quand je cherche que j'apprécie ceux qui le font. Et rien ne m'énerve plus que le message "C'est bon ça fonctionne" sans explication.
Voici le code un peu plus détaillé

Code :
  1. var folders = await KnownFolders.RemovableDevices.GetFoldersAsync();
  2.             foreach (var storageFolders in folders)
  3.             {
  4.                 //Work with file
  5.             }

Reply

Marsh Posté le 20-07-2016 à 15:36:06    

C'est tout simple.  
Par contre c'est bien pour avoir les lecteurs actuellement connectés (comme tu souhaites donc tout va bien!) et pas pour mettre un espèce de watcher dessus.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 20-07-2016 à 17:09:34    

En combinant les deux on doit pouvoir faire un truc sympa mais c'est pas utile pour moi donc je vais (pour l'instant!) pas chercher plus loin!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed