2010-03-24 2 views
1

Im пишу приложение WPF, которое хочет получить доступ к цифровой камере, и безумно googling для решений, и я очень доволен тем, как все это происходит.Как получить файлы с устройства с помощью USB

Это то, что у меня есть на данный момент:

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; 
      } 
     } 
    } 

Это на самом деле все работает отлично подходит для моей цифровой камеры, и я могу получить фотографии с нее. В это время я должен отметить, что когда я подключаю свою камеру, она появляется в окнах под «устройствами со съемным хранилищем», и у нее есть буква диска, выделенная для него.

Однако, когда я включил в моем iPhone, чтобы проверить это, iPhone не появляется под этим разделом, и не представляется буква диска, связанная с ним ...

Но вот мой главный вопрос: почему сообщение с окном DBT_DEVNODES_CHANGED срабатывает при добавлении iPhone, но сообщение DBT_DEVICEARRIVAL срабатывает при добавлении камеры?

Я бы в идеале хотелось бы иметь возможность «получить» файлы с любого USB-устройства, когда пользователь подключает его.

Кто-нибудь есть опыт работы с этим? Моя программирования Win32 очень ограниченно ...

Приветствия, Марк

ответ

2

Есть два вида поставщиков USB носителей. Устройства USB Mass Storage, которые действуют как диски и устройства Windows Media для простых камер и переносных медиаплееров.

Некоторые камеры (как правило, дешевые) используют только модель устройства Windows Media, а другие - модель USB Mass Storage.

Из того, что вы объясняете, iPhone рассматривается как устройство Windows Media, когда камера является запоминающим устройством USB. Я знаю, что есть некоторые проблемы с некоторыми устройствами Apple (особенно с сенсорным генератором), внезапно переключаясь на модель WMD, когда на устройстве есть снимки или скриншоты. Попробуйте удалить скриншоты или изображения, которые вы сделали с iPhone, и посмотрите, исправляет ли они проблему, если это так, потому что ваш код не поддерживает модель устройств Windows Media.

MSDN library может помочь вам разобраться в этом беспорядке. Они несколько раз обновляли API, прекратили некоторые его части, добавили больше в других местах, и теперь кажется, что у них есть новая версия, которая будет исправлять все TM.

+0

Спасибо, на самом деле, я не слишком обеспокоен тем, что устройства Apple не работают, мне действительно нужны камеры для работы. Мне было любопытно все это, и если он будет жестким, то в этот момент плохой диск с цифровыми камерами. – Mark

+0

Проблема заключается в том, что большинство камер поддерживают только модель устройств Windows. Камеры, выступающие в качестве хранилища USB-накопителей, являются меньшинством, или, в лучшем случае, они были меньшинством несколько лет назад. Удачи с этим. – Coincoin

+0

Я вижу, так как я могу получить файлы программно на медиа-устройстве? – Mark