2010-03-24 3 views
1

Je suis en train d'écrire une application WPF qui veut accéder à un appareil photo numérique, et je suis fou de trouver des solutions et je suis assez content de la façon dont ça se passe.Comment obtenir des fichiers à partir d'un périphérique utilisant USB

C'est ce que j'ai en ce moment:

private const decimal WM_DEVICECHANGE = 0x0219; 
    private const int DBT_DEVTYP_HANDLE = 6; 
    private const int DBT_DEVNODES_CHANGED = 7; 
    private const int BROADCAST_QUERY_DENY = 0x424D5144; 
    private const int DBT_DEVICEARRIVAL = 0x8000; // system detected a new device 
    private const int DBT_DEVICEQUERYREMOVE = 0x8001; // Preparing to remove (any program can disable the removal) 
    private const int DBT_DEVICEREMOVECOMPLETE = 0x8004; // removed 
    private const int DBT_DEVTYP_VOLUME = 0x00000002; // drive type is logical volume 

    protected override void OnSourceInitialized(EventArgs e) 
    { 
     base.OnSourceInitialized(e); 
     var mainFormWinInteropHelper = new System.Windows.Interop.WindowInteropHelper(this); 
     System.Windows.Interop.HwndSource.FromHwnd(mainFormWinInteropHelper.Handle).AddHook(HwndHandler); 
    } 

    private IntPtr HwndHandler(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled) 
    { 
     ProcessWinMessage(msg, wparam, lparam); 
     handled = false; 
     return IntPtr.Zero; 
    } 

    private void ProcessWinMessage(int msg, IntPtr wparam, IntPtr lparam) 
    { 
     int deviceType; 
     char driveLetter; 

     if (msg == WM_DEVICECHANGE) 
     { 
      var int32 = wparam.ToInt32(); 

      switch (int32) 
      { 
       case DBT_DEVICEARRIVAL: 
        Console.WriteLine("Device Arrival"); 
        break; 
       case DBT_DEVICEQUERYREMOVE: 
        Console.WriteLine("Device Query Removed"); 
        break; 
       case DBT_DEVICEREMOVECOMPLETE: 
        Console.WriteLine("Device Removed"); 
        break; 
       case DBT_DEVNODES_CHANGED: 
        Console.WriteLine("Device added or removed"); 
        break; 
      } 
     } 
    } 

Cela fait tout fonctionne très bien pour mon appareil photo numérique et je peux obtenir les photos disponibles en dehors. Je dois noter à ce moment-là que lorsque je branche mon appareil photo, il apparaît dans les fenêtres sous les "périphériques avec stockage amovible", et il a une lettre de lecteur qui lui est attribuée.

Cependant, quand je branché mon iPhone pour le tester, l'iPhone n'a pas apparaît sous cet article, et ne semble pas avoir une lettre de lecteur lui est associé ...

Mais voici mon question principale, pourquoi le message Windows DBT_DEVNODES_CHANGED se déclenche-t-il lorsque j'ajoute l'iPhone, mais le message DBT_DEVICEARRIVAL se déclenche lorsque j'ajoute la caméra?

Je voudrais idéalement être en mesure de fichiers « get » de tout périphérique USB lorsque l'utilisateur se branche dans.

Quelqu'un at-il une expérience avec cela? Ma programmation Win32 est très limité ...

Cheers, Mark

Répondre

2

Il existe deux types de fournisseurs de médias USB. Les périphériques de stockage de masse USB qui agissent comme les lecteurs et les périphériques Windows Media pour les appareils photo simples et les lecteurs multimédia portables.

Certains appareils photo (généralement les moins chers) n'implémentent que le modèle Windows Media Device tandis que d'autres implémentent le modèle USB Mass Storage. D'après ce que vous expliquez, l'iPhone est traité comme un périphérique Windows Media alors que l'appareil photo est un stockage de masse USB. Je sais qu'il y a des «problèmes» avec certains appareils Apple (notamment la génération tactile) qui passent soudainement au modèle WMD lorsqu'il y a des images ou des captures d'écran sur l'appareil. Essayez de supprimer les captures d'écran ou les photos que vous avez prises avec l'iPhone et de voir si cela résout le problème. Dans ce cas, votre code ne prend pas en charge le modèle Windows Media Devices. Le MSDN library peut vous aider à trier ce désordre. Ils ont mis à jour l'API plusieurs fois, en ont interrompu certaines parties, en ont ajouté d'autres ailleurs et maintenant il semble qu'ils ont une nouvelle version qui va réparer tout ça.

+0

Merci, en fait, je ne suis pas trop préoccupé par le fait que les appareils Apple ne fonctionnent pas, j'ai juste besoin de caméras pour fonctionner. J'étais plus curieux à propos de tout cela, et si ça va être difficile, alors je m'en tiens aux appareils photo numériques à ce moment-là. – Mark

+0

Le problème est que la plupart des caméras ne prennent en charge que le modèle des périphériques Windows Media. Les caméras agissant comme stockage de masse USB sont la minorité, ou au mieux, elles étaient minoritaires il y a quelques années. Bonne chance avec ça. – Coincoin

+0

Je vois, alors comment pourrais-je obtenir les fichiers par programmation sur un appareil multimédia? – Mark

Questions connexes