Как получить файлы с устройства через USB - PullRequest
1 голос
/ 24 марта 2010

Я пишу приложение WPF, которое хочет получить доступ к цифровой камере, и я безумно ищу решения, и я очень доволен тем, как все идет.

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

    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 не отображается в этом разделе и, похоже, с ним не связана буква диска ...

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

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

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

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

1 Ответ

2 голосов
/ 24 марта 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...