Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Windows. Devices.Enumeration API позволяют находить устройства, которые внутренне подключены к системе, подключаются к внешней сети или обнаруживаются через беспроводные или сетевые протоколы.
Образцы
Самый простой способ перечисления всех доступных устройств — сделать моментальный снимок с помощью команды FindAllAsync (описано далее в разделе ниже).
async void enumerateSnapshot(){
DeviceInformationCollection collection = await DeviceInformation.FindAllAsync();
}
См. пример перечисления устройств и их сопряжения для более сложного примера API Windows.Devices.Enumeration.
API для перечисления
Windows. Devices.Enumeration пространство имен позволяет находить устройства, которые внутренне подключены к системе, подключены к внешней сети или обнаруживаются по беспроводным или сетевым протоколам. Ниже перечислены некоторые функции, поддерживаемые этими API:
- Поиск устройства для подключения к приложению.
- Получение сведений о устройствах, подключенных к системе или доступных для обнаружения.
- Настройте приложение так, чтобы оно получало уведомления при добавлении, подключении и отключении устройств, изменении их статуса подключения или других свойств.
- Разрешите приложению получать фоновые триггеры при подключении и отключении устройств, изменении состояния подключения или других свойств.
Эти API могут перечислять устройства по любому из следующих протоколов и шин при условии, что и само устройство, и система, на которой работает приложение, поддерживают эту технологию. Это не исчерпывающий список, а другие протоколы могут поддерживаться определенным устройством.
- Физически подключенные автобусы. К ним относятся PCI и USB. Например, все, что можно увидеть в диспетчер устройств.
- Upnp
- Альянс по сети цифровой жизни (DLNA)
- Обнаружение и запуск (DIAL)
- Обнаружение служб DNS (DNS-SD)
- Веб-службы на устройствах (WSD)
- Bluetooth
- Wi-Fi Direct
- WiGig
- Точка обслуживания
Во многих случаях вам не нужно беспокоиться об использовании API перечисления. Это связано с тем, что многие API, использующие устройства, автоматически выбирают соответствующее устройство по умолчанию или предоставляют более упрощенный API перечисления. Например, MediaPlayerElement автоматически будет использовать устройство отрисовщика звука по умолчанию. Если приложение может использовать устройство по умолчанию, то API для перечисления устройств ему не нужны. API перечисления предоставляют общий и гибкий способ обнаружения и подключения к доступным устройствам. В этом разделе содержатся сведения о перечислении устройств и описаны четыре распространенных способа перечисления устройств.
- Использование пользовательского интерфейса DevicePicker
- Перечисление устройств, обнаруживаемых системой в данный момент
- Перечисление устройств, которые в настоящее время доступны для обнаружения и отслеживания изменений
- Перечисление устройств, доступных для обнаружения и отслеживания изменений в фоновой задаче
объекты DeviceInformation
При работе с API перечисления вам часто потребуется использовать объекты DeviceInformation. Эти объекты содержат большую часть доступных сведений об устройстве. В следующей таблице описаны некоторые свойства DeviceInformation , которые вам нужны. Полный список см. на странице со справочной информацией о DeviceInformation.
| Property | Comments |
|---|---|
| DeviceInformation.Id | Это уникальный идентификатор устройства и предоставляется в виде строковой переменной. В большинстве случаев это непрозрачное значение, которое вы просто передаете из одного метода в другой, чтобы указать конкретное устройство, которое вы хотите. Вы также можете использовать это свойство и свойство DeviceInformation.Kind после закрытия приложения и повторного его открытия. Это обеспечит восстановление и повторное использование одного и того же объекта DeviceInformation. |
| DeviceInformation.Kind | Это указывает тип объекта устройства, представленного объектом DeviceInformation. Это не категория устройства или тип устройства. Одно устройство может быть представлено несколькими различными объектами DeviceInformation различных типов. Возможные значения этого свойства перечислены в DeviceInformationKind , а также как они связаны друг с другом. |
| DeviceInformation.Properties | Этот контейнер свойств содержит сведения, запрашиваемые для объекта DeviceInformation. Наиболее распространенные свойства легко ссылаются в качестве свойств объекта DeviceInformation , например с DeviceInformation.Name. Дополнительные сведения см. в разделе "Свойства сведений об устройстве". |
Пользовательский интерфейс DevicePicker
Элемент управления DevicePicker — это элемент управления, предоставляемый Windows, который создает небольшой пользовательский интерфейс, позволяющий пользователю выбрать устройство из списка. Его можно настроить несколькими способами, например:
- Управляйте тем, какие устройства отображаются в пользовательском интерфейсе, добавив SupportedDeviceSelectors, SupportedDeviceClasses или оба параметра в DevicePicker.Filter. В большинстве случаев необходимо добавить только один селектор или класс, но если вам потребуется несколько, можно добавить несколько. При добавлении нескольких селекторов или классов они связаны с помощью функции логики OR.
- Укажите свойства, которые нужно получить для устройств. Это можно сделать, добавив свойства в DevicePicker.RequestedProperties.
- Измените внешний вид DevicePicker с помощью Appearance.
- Укажите размер и расположение элемента DevicePicker при его отображении.
Пока отображается DevicePicker содержимое пользовательского интерфейса будет автоматически обновлено, если устройства добавлены, удалены или обновлены.
Note
Нельзя указать DeviceInformationKind с помощью DevicePicker. Если вам нужны устройства определенного типа DeviceInformationKind, необходимо создать DeviceWatcher и реализовать собственный пользовательский интерфейс.
Трансляция медиаконтента и DIAL также предоставляют собственные средства выбора устройств, если вы хотите их использовать. Они CastingDevicePicker и DialDevicePicker соответственно.
Перечисление моментального снимка устройств
В некоторых сценариях DevicePicker не будет подходит для ваших потребностей, и вам потребуется что-то более гибкое. Возможно, вам нужно создать собственный пользовательский интерфейс или перечислить устройства без отображения пользовательского интерфейса пользователю. В таких ситуациях можно получить текущий список устройств. Это включает в себя просмотр устройств, которые в настоящее время подключены к системе или связаны с ней. Однако необходимо учитывать, что этот метод просматривает только моментальный снимок доступных устройств, поэтому вы не сможете найти устройства, которые подключаются после перечисления по списку. Вы также не будете получать уведомления, если устройство обновляется или удаляется. Еще одним потенциальным недостатком является то, что этот метод будет удерживать любые результаты до завершения всего перечисления. По этой причине этот метод не следует использовать, если вы заинтересованы в объектах AssociationEndpoint, AssociationEndpointContainer или AssociationEndpointService , так как они найдены по сетевому или беспроводному протоколу. Это может занять до 30 секунд. В этом сценарии следует использовать объект DeviceWatcher, чтобы перечислить возможные устройства.
Чтобы перечислить устройства из моментального снимка, используйте метод FindAllAsync. Этот метод ожидает завершения всего процесса перечисления и возвращает все результаты в виде одного объекта DeviceInformationCollection . Этот метод также перегружен, чтобы предоставить вам несколько вариантов фильтрации результатов и ограничения их на интересующие вас устройства. Это можно сделать, предоставив DeviceClass или передав селектор устройства. Селектор устройства — это строка расширенного синтаксиса запросов (AQS), указывающая устройства, которые необходимо перечислить. Дополнительные сведения см. в разделе "Создание селектора устройства".
Помимо ограничения результатов, можно также указать свойства, которые требуется получить для устройств. Если это сделать, указанные свойства будут доступны в контейнере свойств для каждого объекта DeviceInformation, возвращаемых в коллекции. Важно отметить, что не все свойства доступны для всех типов устройств. Чтобы узнать, какие свойства доступны для типов устройств, см. сведения о свойствах сведений об устройстве.
Перечисление и просмотр устройств
Более мощный и гибкий способ перечисления устройств — создать DeviceWatcher. Этот параметр обеспечивает большую гибкость при перечислении устройств. Он позволяет перечислять устройства, которые в настоящее время присутствуют, а также получать уведомления, когда устройства, соответствующие селектору устройств, добавляются, удаляются или изменяются свойства. При создании DeviceWatcher вы предоставляете селектор устройств. Дополнительные сведения о селекторах устройств см. в разделе "Создание селектора устройств". После создания наблюдателя вы получите следующие уведомления для любого устройства, соответствующего заданным критериям.
- Добавьте уведомление при добавлении нового устройства.
- Обновите уведомление об изменении интересующего вас свойства.
- Удалите уведомление, когда устройство больше не доступно или больше не соответствует фильтру.
В большинстве случаев, когда вы используете DeviceWatcher, вы сохраняете список устройств и добавляете в него, удаляя элементы из него или обновляя элементы, когда наблюдатель получает обновления от отслеживаемых устройств. При получении уведомления об обновлении обновленные сведения будут доступны как объект DeviceInformationUpdate . Чтобы обновить список устройств, сначала найдите соответствующий объект DeviceInformation, который изменился. Затем вызовите метод Update для этого объекта, предоставляя объект DeviceInformationUpdate . Это удобная функция, которая автоматически обновляет объект DeviceInformation .
Так как DeviceWatcher отправляет уведомления по мере поступления устройств и при их изменении следует использовать этот метод перечисления устройств, если вы заинтересованы в AssociationEndpoint, AssociationEndpointContainer или AssociationEndpointService так как они перечисляются по сетевым или беспроводным протоколам.
Чтобы создать DeviceWatcher, используйте один из методов CreateWatcher. Эти методы перегружены, чтобы позволить вам указать интересующие вас устройства. Это можно сделать, предоставив DeviceClass или передав селектор устройства. Селектор устройства — это строка AQS, указывающая устройства, которые требуется перечислить. Дополнительные сведения см. в разделе "Создание селектора устройства". Вы также можете указать свойства, которые вы хотите получить для устройств и заинтересованы в них. Если это сделать, указанные свойства будут доступны в контейнере свойств для каждого объекта DeviceInformation, возвращаемых в коллекции. Важно отметить, что не все свойства доступны для всех типов устройств. Сведения о доступных свойствах устройств см. в разделе "Свойства сведений об устройстве"
Просмотр устройств в качестве фоновой задачи
Отслеживание устройств в качестве фоновой задачи очень похоже на создание DeviceWatcher, как описано выше. На самом деле вам всё равно потребуется сначала создать обычный объект DeviceWatcher, как описано в предыдущем разделе. Создав его, вы вызываете GetBackgroundTrigger вместо DeviceWatcher.Start. При вызове GetBackgroundTrigger необходимо указать, какие уведомления вам нужны: добавление, удаление или обновление. Вы также не можете запросить обновление или удаление без запроса на добавление. После регистрации триггера устройство DeviceWatcher начнет работать сразу же в фоновом режиме. С этого момента при каждом получении нового уведомления для вашего приложения, соответствующего вашим критериям, будет запускаться фоновая задача и предоставлять вам последние изменения с момента последнего запуска вашего приложения этой задачей.
Important
Первый раз, когда DeviceWatcherTrigger запускает приложение, когда наблюдатель достигнет состояния EnumerationCompleted. Это означает, что он будет содержать все начальные результаты. При всех последующих срабатываниях, когда оно будет запускать ваше приложение, оно будет содержать только уведомления о добавлении, обновлении и удалении, произошедшие с момента предыдущего срабатывания. Это немного отличается от объекта переднего плана DeviceWatcher, так как начальные результаты не приходят в один раз и доставляются только в пакете после достижения EnumerationCompleted.
Некоторые беспроводные протоколы ведут себя по-разному, если они сканируются в фоновом режиме и переднем плане, или они могут вообще не поддерживать сканирование в фоновом режиме. Существует три возможности с отношением к фоновому сканированию. В следующей таблице перечислены возможные варианты и их влияние на ваше приложение. Например, Bluetooth и Wi‑Fi Direct не поддерживают фоновое сканирование, поэтому, соответственно, они не поддерживают триггер DeviceWatcherTrigger.
| Behavior | Влияние |
|---|---|
| То же поведение в фоновом режиме | Нет |
| Только пассивные проверки, возможные в фоновом режиме | Для обнаружения устройства может потребоваться больше времени, пока не будет выполнено пассивное сканирование. |
| Фоновое сканирование не поддерживается | DeviceWatcherTrigger не будет распознавать никакие устройства, и никакие обновления не будут передаваться. |
Если DeviceWatcherTrigger включает протокол, который не поддерживает сканирование в качестве фоновой задачи, триггер по-прежнему будет работать. Однако вы не сможете получать какие-либо обновления или результаты по протоколу. Обновления для других протоколов или устройств по-прежнему обнаруживаются обычно.
Использование типа DeviceInformationKind
В большинстве сценариев вам не нужно учитывать тип DeviceInformationKind объекта DeviceInformation. Это связано с тем, что селектор устройства, возвращаемый API устройства, который вы используете, часто гарантирует, что вы получаете правильные виды объектов устройств для использования с их API. Однако в некоторых сценариях вы хотите получить DeviceInformation для устройств, но нет соответствующего API устройства для предоставления селектора устройств. В этих случаях вам потребуется создать собственный селектор. Например, веб-службы на устройствах не имеют выделенного API, но вы можете обнаружить эти устройства и получить сведения о них с помощью Windows. Devices.Enumeration API, а затем используйте их с помощью API сокета.
Если вы создаете собственный селектор устройств для перечисления объектов устройств, вам будет важно понимать, что такое DeviceInformationKind. Все возможные виды, а также как они связаны друг с другом, описаны на справочной странице DeviceInformationKind. Одним из наиболее распространенных способов использования DeviceInformationKind является указание типа устройств, которые вы ищете при отправке запроса в сочетании с селектором устройств. Таким образом обеспечивается, что перечисляются только устройства, соответствующие указанному DeviceInformationKind. Например, можно найти объект DeviceInterface , а затем запустить запрос, чтобы получить сведения для родительского объекта Device . Этот родительский объект может содержать дополнительные сведения.
Важно отметить, что свойства, доступные в контейнере свойств для объекта DeviceInformation зависят от объекта DeviceInformationKind устройства. Некоторые свойства доступны только с определенными типами. Дополнительные сведения о том, какие свойства доступны для каких типов, см. в разделе "Свойства сведений об устройстве". Таким образом, в приведенном выше примере поиск родительского устройства даст вам доступ к дополнительным сведениям, недоступным из объекта устройства DeviceInterface . Из-за этого при создании строк фильтра AQS важно убедиться, что запрошенные свойства доступны для перечисленных объектов DeviceInformationKind . Дополнительные сведения о создании фильтра см. в разделе "Создание селектора устройства".
При перечислении объектов AssociationEndpoint, AssociationEndpointContainer или AssociationEndpointService выполняется перечисление по беспроводному или сетевому протоколу. В этих ситуациях рекомендуется не использовать FindAllAsync и вместо этого использовать CreateWatcher. Это связано с тем, что поиск по сети часто приводит к тому, что операции поиска не завершаются по тайм-ауту в течение 10 или более секунд, прежде чем будет сгенерировано EnumerationCompleted. FindAllAsync не завершает операцию, пока не будет вызвано EnumerationCompleted. Если вы используете DeviceWatcher, вы получите результаты ближе к реальному времени независимо от того, когда вызывается EnumerationCompleted.
Сохранение устройства для последующего использования
Любой объект DeviceInformation однозначно определяется сочетанием двух частей информации: DeviceInformation.Id и DeviceInformation.Kind. Если вы храните эти два фрагмента информации, вы можете повторно создать объект DeviceInformation после его потери, указав эти сведения в CreateFromIdAsync. При этом можно сохранить параметры пользователя для устройства, которое интегрируется с приложением.
Windows developer