Что такое WPD
В одном своем заказе я столкнулся с проблемой. Необходимо было написать для одной программы проводник по подключаемым устройствам на C#. Проблема заключалась в том, что FolderBrowserDialog вообще не собирался работать с теми устройствами, у которых отсутствовала буква диска, а BrowseForFolder не мог работать с папками на таких устройствах, путь к которым превышал 260 символов. Ну что ж, напишем его сами. Для этого мы воспользуемся WDP.
Windows Portable Devices (WPD) позволяет компьютерам взаимодействовать с подключенными внешними устройствами. WPD обеспечивает гибкий и надежный способ взаимодействия компьютеров с музыкальными проигрывателями, флешками, мобильными телефонами, камерами и многими другими типами подключенных устройств.
Приложения, созданные на WPD, могут исследовать устройство, отправлять и получать контент и даже управлять устройством, например, делать снимок или отправлять текстовое сообщение. Система спроектирована так, чтобы быть гибкой, чтобы можно было исследовать многие типы устройств и расширять их, чтобы разработчики драйверов могли определять пользовательские свойства и команды для пользовательских устройств.
Вы можете писать как приложения Windows, так и веб-приложения с помощью WPD. Вы используете интерфейс программирования приложений WPD для создания приложений Windows. Эти приложения могут быть написаны на C ++, C # .Net или Visual Basic .Net. Интерфейс программирования WPD поддерживается в операционных системах Windows 7, Windows Vista и Windows XP. WPD Automation Object Model поддерживается только в Windows 7.
В этой статье мы научимся получать список подключенных устройств их id.
Настройка проекта
Запустите Visual Studio и создайте новое пустое решение именем с wpd. Далее добавьте новое консольное приложение под названием PortableDevices к нему. Чтобы получить доступ к wdp по API, вам нужно добавить ссылки на библиотеки COM “PortableDeviceApi 1.0 Type Library″ и “PortableDeviceTypes 1.0 Type Library”.
Затем выделите обе ссылки и измените свойство “Внедрить типы взаимодействия” на false. Теперь мы готовы, чтобы начать работать с wdp по API-интерфейсу.
Перечисление wpd-устройств
Добавьте новый класс в проект под названием PortableDeviceCollection. Этот класс представляет собой простую коллекция, которая отслеживает PortableDevice экземпляры. Когда экземпляр класса PortableDeviceCollection создается, то его конструктор создает экземпляр типа PortableDeviceManager, который может быть найден в библиотеке Тип PortableDeviceApi 1.0.
public class PortableDeviceCollection : Collection<PortableDevice> { private readonly PortableDeviceManager _deviceManager; public PortableDeviceCollection() { this._deviceManager = new PortableDeviceManager(); } public void Refresh() { //... } }Идем дальше и добавляем класс PortableDevice к проекту. Мы передаем идентификатор устройства при создании нового экземпляра этого класса.
public class PortableDevice { public PortableDevice(string deviceId) { this.DeviceId = deviceId; } public string DeviceId { get; set; } }Давайте создадим коллекцию файлов wpd-совместимых устройств путем реализации метода Refresh() класса PortableDeviceCollection.
public void Refresh() { this._deviceManager.RefreshDeviceList(); // Определяем, сколько wpd-устройства подключено var deviceIds = new string[1]; uint count = 1; this._deviceManager.GetDevices(ref deviceIds[0], ref count); // Получаем идентификатор для каждого подключенного устройства deviceIds = new string[count]; this._deviceManager.GetDevices(ref deviceIds[0], ref count); foreach(var deviceId in deviceIds) { Add(new PortableDevice(deviceId)); } }Мы поручаем PortableDeviceManager подсчитать, сколько устройств подключено к ПК. Далее мы получаем ИД устройства для каждого подключенного устройства, и добавляем новый экземпляр класса PortableDevice в коллекцию.
Добавьте следующий код в основной метод консольного приложения и нажмите клавишу F5 для запуска приложения:
var collection = new PortableDeviceCollection(); collection.Refresh(); foreach(var device in collection) { Console.WriteLine(device.DeviceId); } Console.WriteLine(); Console.WriteLine("Press any key to continue."); Console.ReadKey();Вы увидите примерно следующее:
Это какой-то идентификатор устройства - в данном случае это мой мобильный телефон. Продолжение следует...
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.