Что такое 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, си шарп, внешние устройства, WPD




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Синхронный и асинхронный ввод-вывод Windows
Автоматическое пополнение через ЯндексДеньги на сайт, или HTTP-уведомления
Липовый счетчик лиру: межстрочный интервал и наведение