Wyliczanie urządzeń

Windows. Devices.Enumeration interfejsy API umożliwiają znajdowanie urządzeń, które są wewnętrznie połączone z systemem, podłączone zewnętrznie lub wykrywalne za pośrednictwem protokołów bezprzewodowych lub sieciowych.

Próbki

Najprostszym sposobem wyliczania wszystkich dostępnych urządzeń jest utworzenie migawki za pomocą polecenia FindAllAsync (wyjaśnionej w poniższej sekcji).

async void enumerateSnapshot(){
  DeviceInformationCollection collection = await DeviceInformation.FindAllAsync();
}

Zobacz przykład Wykrywanie i parowanie urządzeń, aby zapoznać się z bardziej zaawansowanym przykładem użycia interfejsów API Windows.Devices.Enumeration.

Interfejsy API wyliczania

Windows. Devices.Enumeration umożliwia znajdowanie urządzeń, które są wewnętrznie połączone z systemem, połączone zewnętrznie lub wykrywalne za pośrednictwem protokołów sieci bezprzewodowej lub sieciowej. Oto niektóre funkcje obsługiwane przez te interfejsy API:

  • Znajdowanie urządzenia do nawiązania połączenia z aplikacją.
  • Uzyskiwanie informacji o urządzeniach połączonych z systemem lub ich odnajdywanie.
  • Aplikacja ma otrzymywać powiadomienia, gdy urządzenia są dodawane, łączą się, rozłączają, zmieniają stan online lub zmieniają inne właściwości.
  • Pozwól aplikacji odbierać wyzwalacze działające w tle, gdy urządzenia łączą się, rozłączają się, zmieniają stan połączenia online lub inne właściwości.

Te interfejsy API mogą wyliczać urządzenia za pośrednictwem dowolnego z następujących protokołów i magistrali, pod warunkiem, że poszczególne urządzenia i system z uruchomioną aplikacją obsługują daną technologię. Nie jest to wyczerpująca lista, a inne protokoły mogą być obsługiwane przez określone urządzenie.

W wielu przypadkach nie trzeba martwić się o używanie interfejsów API wyliczania. Dzieje się tak, ponieważ wiele interfejsów API korzystających z urządzeń automatycznie wybiera właściwe urządzenie domyślne lub udostępnia bardziej uproszczony interfejs API do enumeracji. Na przykład MediaElement automatycznie użyje domyślnego urządzenia renderatora audio. Jeśli aplikacja może korzystać z domyślnego urządzenia, nie ma potrzeby używania interfejsów API służących do wyliczania urządzeń. Interfejsy API do wyliczania oferują ogólny i elastyczny sposób wykrywania dostępnych urządzeń oraz łączenia się z nimi. Ten temat zawiera informacje na temat wyliczania urządzeń i opisuje cztery typowe sposoby wyliczania urządzeń.

  • Za pomocą interfejsu użytkownika DevicePicker
  • Tworzenie migawki urządzeń aktualnie wykrywanych przez system
  • Wyliczanie urządzeń obecnie możliwych do odnalezienia i obserwowanie zmian
  • Wyliczanie urządzeń obecnie możliwych do odnalezienia i obserwowanie zmian w zadaniu w tle

Obiekty DeviceInformation

Podczas pracy z interfejsami API wyliczania często trzeba używać obiektów DeviceInformation. Te obiekty zawierają większość dostępnych informacji o urządzeniu. W poniższej tabeli opisano niektóre właściwości DeviceInformation , które cię interesują. Aby uzyskać pełną listę, zobacz stronę referencyjną deviceInformation.

Property Comments
DeviceInformation.Id Jest to unikatowy identyfikator urządzenia i jest udostępniany jako zmienna ciągu. W większości przypadków jest to nieprzezroczysta wartość, którą po prostu przekażesz z jednej metody do innej, aby wskazać wybrane urządzenie. Możesz również użyć tej właściwości i właściwości DeviceInformation.Kind po zamknięciu aplikacji i ponownym otwarciu jej. Dzięki temu można odzyskać i ponownie użyć tego samego obiektu DeviceInformation.
DeviceInformation.Kind Wskazuje to rodzaj obiektu urządzenia reprezentowanego przez obiekt DeviceInformation. Nie jest to kategoria urządzenia ani typ urządzenia. Jedno urządzenie może być reprezentowane przez kilka różnych obiektów DeviceInformation różnych rodzajów. Możliwe wartości tej właściwości są wymienione w elemecie DeviceInformationKind , a także sposób ich powiązania ze sobą.
DeviceInformation.Properties Ta torba właściwości zawiera informacje żądane dla obiektu DeviceInformation. Do najczęściej używanych właściwości można łatwo uzyskać dostęp jako do właściwości obiektu DeviceInformation, na przykład DeviceInformation.Name. Aby uzyskać więcej informacji, zobacz Właściwości informacji o urządzeniu.

 

Interfejs użytkownika platformy DevicePicker

DevicePicker to kontrolka zapewniana przez Windows, która tworzy mały interfejs użytkownika, który umożliwia użytkownikowi wybranie urządzenia z listy. Można ją dostosować na kilka sposobów, takich jak:

  • Kontrolowanie urządzeń wyświetlanych w interfejsie użytkownika przez dodanie elementów SupportedDeviceSelectors, SupportedDeviceClasses lub obu tych elementów do elementu DevicePicker.Filter. W większości przypadków wystarczy dodać tylko jeden selektor lub klasę, ale jeśli potrzebujesz więcej niż jednej, możesz dodać wiele. Jeśli dodasz wiele selektorów lub klas, są one połączone przy użyciu funkcji logiki OR.
  • Określ właściwości, które chcesz pobrać dla urządzeń. Można to zrobić, dodając właściwości do DevicePicker.RequestedProperties.
  • Zmień wygląd DevicePicker używając Appearance.
  • Określ rozmiar i położenie elementu DevicePicker podczas wyświetlania.

Podczas wyświetlania DevicePicker zawartość interfejsu użytkownika zostanie automatycznie zaktualizowana, jeśli urządzenia zostaną dodane, usunięte lub zaktualizowane.

Note

Nie można określić DeviceInformationKind przy użyciu DevicePicker. Jeśli chcesz mieć urządzenia z określonym DeviceInformationKind, musisz skompilować DeviceWatcher i udostępnić własny interfejs użytkownika.

Rzutowanie treści multimedialnych i DIAL również udostępniają własne narzędzia wyboru, jeśli chcesz z nich korzystać. Są to odpowiednio CastingDevicePicker i DialDevicePicker.

Wyświetl stan urządzeń

W niektórych scenariuszach DevicePicker nie będzie odpowiedni dla Twoich potrzeb i potrzebujesz czegoś bardziej elastycznego. Być może chcesz utworzyć własny interfejs użytkownika lub musisz wyliczyć urządzenia bez wyświetlania interfejsu użytkownika użytkownikowi. W takich sytuacjach można wyliczyć migawkę urządzeń. Obejmuje to przeglądanie urządzeń, które są obecnie połączone z systemem lub sparowane z systemem. Należy jednak pamiętać, że ta metoda uwzględnia jedynie stan urządzeń dostępnych w danym momencie, więc nie będzie można znaleźć urządzeń, które połączą się po przejrzeniu listy. Nie otrzymasz również powiadomienia, jeśli urządzenie zostanie zaktualizowane lub usunięte. Innym potencjalnym minusem jest to, że ta metoda wstrzyma wszelkie wyniki do momentu ukończenia całego wyliczenia. Z tego powodu nie należy używać tej metody, jeśli interesuje Cię obiekt AssociationEndpoint, AssociationEndpointContainer lub AssociationEndpointService , ponieważ znajdują się one za pośrednictwem sieci lub protokołu bezprzewodowego. Ukończenie tego procesu może potrwać do 30 sekund. W tym scenariuszu należy użyć obiektu DeviceWatcher do wyliczenia możliwych urządzeń.

Aby wyliczyć urządzenia z migawki, użyj metody FindAllAsync. Ta metoda czeka na ukończenie całego procesu wyliczania i zwraca wszystkie wyniki jako jeden obiekt DeviceInformationCollection . Ta metoda jest również przeciążona i udostępnia kilka opcji filtrowania wyników oraz ograniczania ich do urządzeń, którymi jesteś zainteresowany. Można to zrobić, podając DeviceClass lub przekazując selektor urządzenia. Selektor urządzenia to ciąg Advanced Query Syntax (AQS), który określa urządzenia, które mają zostać wyliczone. Aby uzyskać więcej informacji, zobacz Tworzenie selektora urządzeń.

Oprócz ograniczania wyników można również określić właściwości, które chcesz pobrać dla urządzeń. Jeśli tak, określone właściwości będą dostępne w zbiorze właściwości dla każdego z obiektów DeviceInformation zwróconych w kolekcji. Należy pamiętać, że nie wszystkie właściwości są dostępne dla wszystkich rodzajów urządzeń. Aby zobaczyć, jakie właściwości są dostępne dla jakiego rodzaju urządzeń, zobacz Właściwości informacji o urządzeniu.

Wyliczanie i obserwowanie urządzeń

Bardziej zaawansowaną i elastyczną metodą wyliczania urządzeń jest utworzenie DeviceWatcher. Ta opcja zapewnia największą elastyczność podczas wyliczania urządzeń. Umożliwia wyliczanie aktualnie obecnych urządzeń, a także odbieranie powiadomień, gdy urządzenia pasujące do selektora urządzeń są dodawane, usuwane lub zmieniane właściwości. Podczas tworzenia obiektu DeviceWatcher należy podać selektor urządzeń. Aby uzyskać więcej informacji na temat selektorów urządzeń, zobacz Tworzenie selektora urządzeń. Po utworzeniu obserwatora otrzymasz następujące powiadomienia dotyczące dowolnego urządzenia spełniającego podane kryteria.

  • Dodaj powiadomienie po dodaniu nowego urządzenia.
  • Zaktualizuj powiadomienie, gdy właściwość, którą cię interesujesz, zostanie zmieniona.
  • Usuń powiadomienie, gdy urządzenie nie jest już dostępne lub nie jest już zgodne z filtrem.

W większości przypadków, gdy używasz DeviceWatcher utrzymujesz listę urządzeń i dodasz do niej, usuwasz z niego elementy lub aktualizujesz elementy, gdy obserwator otrzymuje aktualizacje z obserwowanych urządzeń. Po otrzymaniu powiadomienia o aktualizacji zaktualizowane informacje będą dostępne jako obiekt DeviceInformationUpdate . Aby zaktualizować listę urządzeń, najpierw znajdź odpowiedni obiekt DeviceInformation, które uległo zmianie. Następnie wywołaj metodę Update dla tego obiektu, podając obiekt DeviceInformationUpdate . Jest to funkcja wygody, która automatycznie zaktualizuje obiekt DeviceInformation .

Ponieważ DeviceWatcher wysyła powiadomienia po nadejściu urządzeń i po ich zmianie, należy użyć tej metody wyliczania urządzeń, gdy interesuje Cię AssociationEndpoint, AssociationEndpointContainer lub AssociationEndpointService ponieważ są wyliczane za pośrednictwem sieci lub protokołów bezprzewodowych.

Aby utworzyć DeviceWatcher użyj jednej z metod CreateWatcher. Te metody są przeciążone, aby umożliwić określenie urządzeń, które Cię interesują. Można to zrobić, podając DeviceClass lub przekazując selektor urządzenia. Selektor urządzeń to ciąg AQS określający urządzenia, które mają zostać wyliczone. Aby uzyskać więcej informacji, zobacz Tworzenie selektora urządzeń. Możesz również określić właściwości, które chcesz pobrać dla urządzeń i które cię interesują. Jeśli tak, określone właściwości będą dostępne w zbiorze właściwości dla każdego z obiektów DeviceInformation zwróconych w kolekcji. Należy pamiętać, że nie wszystkie właściwości są dostępne dla wszystkich rodzajów urządzeń. Aby zobaczyć, jakie właściwości są dostępne dla jakiego rodzaju urządzeń, zobacz Właściwości informacji o urządzeniu

Obserwowanie urządzeń jako zadania w tle

Monitorowanie urządzeń w ramach zadania działającego w tle jest bardzo podobne do tworzenia obiektu DeviceWatcher, jak opisano powyżej. W rzeczywistości nadal musisz najpierw utworzyć normalny obiekt DeviceWatcher zgodnie z opisem w poprzedniej sekcji. Po jego utworzeniu wywołasz metodę GetBackgroundTrigger zamiast DeviceWatcher.Start. Podczas wywoływania polecenia GetBackgroundTrigger należy określić, które powiadomienia cię interesują: dodawanie, usuwanie lub aktualizowanie. Nie można również zażądać aktualizacji lub usunięcia bez żądania dodania. Po zarejestrowaniu wyzwalacza DeviceWatcher natychmiast zacznie działać w tle. Od tego momentu za każdym razem, gdy zadanie w tle otrzyma nowe powiadomienie dotyczące aplikacji, które spełnia kryteria, zostanie uruchomione i przekaże najnowsze zmiany od czasu ostatniego uruchomienia dla tej aplikacji.

Important

Po raz pierwszy DeviceWatcherTrigger uruchomi aplikację, gdy obserwator osiągnie stan EnumerationCompleted. Oznacza to, że będzie zawierać wszystkie początkowe wyniki. Przy każdym kolejnym wywołaniu Twojej aplikacji będzie ona zawierać tylko powiadomienia o dodaniu, zaktualizowaniu i usunięciu, które wystąpiły od ostatniego wywołania. Różni się to nieco od obiektu pierwszego planu DeviceWatcher ponieważ początkowe wyniki nie pojawiają się pojedynczo i są dostarczane tylko w pakiecie po osiągnięciu EnumerationCompleted.

Niektóre protokoły bezprzewodowe zachowują się inaczej podczas skanowania w tle niż na pierwszym planie albo w ogóle nie obsługują skanowania w tle. Istnieją trzy możliwości związane ze skanowaniem w tle. W poniższej tabeli wymieniono możliwości i skutki, jakie może to mieć w aplikacji. Na przykład Bluetooth i Wi‑Fi Direct nie obsługują skanowania w tle, w związku z tym nie obsługują też elementu DeviceWatcherTrigger.

Behavior Wpływ
To samo zachowanie w tle Żadne
Tylko pasywne skanowania możliwe w tle Wykrycie urządzenia może potrwać dłużej podczas oczekiwania na skanowanie pasywne.
Skanowanie w tle nie jest obsługiwane Żadne urządzenia nie będą wykrywalne przez DeviceWatcherTrigger i nie będą zgłaszane żadne aktualizacje.

 Jeśli DeviceWatcherTrigger zawiera protokół, który nie obsługuje skanowania w tle, wyzwalacz nadal będzie działać. Jednak nie będzie można uzyskać żadnych aktualizacji ani wyników za pośrednictwem tego protokołu. Aktualizacje innych protokołów lub urządzeń będą nadal wykrywane normalnie.

Korzystanie z DeviceInformationKind

W większości scenariuszy nie trzeba martwić się o DeviceInformationKind obiektu DeviceInformation. Dzieje się tak, ponieważ selektor urządzenia zwracany przez używany interfejs API urządzenia często gwarantuje, że uzyskujesz odpowiednie rodzaje obiektów urządzeń do użycia z ich interfejsem API. Jednak w niektórych scenariuszach może być konieczne uzyskanie obiektu DeviceInformation dla urządzeń, ale nie ma odpowiadającego mu interfejsu API urządzenia, który udostępnia selektor urządzeń. W takich przypadkach należy utworzyć własny selektor. Na przykład funkcja Web Services on Devices nie ma dedykowanego interfejsu API, ale możesz wykryć te urządzenia i uzyskać informacje na ich temat za pomocą interfejsów API Windows.Devices.Enumeration, a następnie korzystać z nich przy użyciu interfejsów API gniazd.

Jeśli tworzysz własny selektor urządzeń do wyliczania za pomocą obiektów urządzeń, funkcja DeviceInformationKind będzie dla Ciebie ważna. Wszystkie możliwe rodzaje, a także sposób ich powiązania ze sobą, są opisane na stronie referencyjnej deviceInformationKind. Jednym z najczęstszych zastosowań elementu DeviceInformationKind jest określenie, jakiego rodzaju urządzenia szukasz podczas przesyłania zapytania w połączeniu z selektorem urządzeń. Dzięki temu masz pewność, że podczas wyliczania uwzględnisz tylko urządzenia zgodne z podanym typem DeviceInformationKind. Można na przykład znaleźć obiekt DeviceInterface , a następnie uruchomić zapytanie, aby uzyskać informacje dotyczące nadrzędnego obiektu Device . Ten obiekt nadrzędny może zawierać dodatkowe informacje.

Należy pamiętać, że właściwości dostępne w zbiorze właściwości obiektu DeviceInformation różnią się w zależności od typu urządzenia DeviceInformationKind. Niektóre właściwości są dostępne tylko w przypadku niektórych rodzajów. Aby uzyskać więcej informacji o tym, które właściwości są dostępne dla poszczególnych rodzajów, zobacz Właściwości informacji o urządzeniu. W związku z tym w powyższym przykładzie wyszukiwanie elementu nadrzędnego Urządzenie zapewni dostęp do dodatkowych informacji, które nie były dostępne w obiekcie urządzenia DeviceInterface . W związku z tym podczas tworzenia ciągów filtru AQS ważne jest, aby upewnić się, że żądane właściwości są dostępne dla wyliczanych obiektów DeviceInformationKind . Aby uzyskać więcej informacji na temat tworzenia filtru, zobacz Tworzenie selektora urządzeń.

Podczas wyliczania obiektów AssociationEndpoint, AssociationEndpointContainer lub AssociationEndpointService wylicza się za pośrednictwem protokołu bezprzewodowego lub sieciowego. W takich sytuacjach zalecamy, aby nie używać metody FindAllAsync , a zamiast tego użyj polecenia CreateWatcher. Wynika to z faktu, że wyszukiwanie w sieci często skutkuje operacjami wyszukiwania, które przez co najmniej 10 sekund nie kończą się przekroczeniem limitu czasu przed wygenerowaniem EnumerationCompleted. Funkcja FindAllAsync nie kończy operacji do momentu wyzwolenia funkcji EnumerationCompleted . Jeśli używasz DeviceWatcher, uzyskasz wyniki bliżej czasu rzeczywistego niezależnie od tego, kiedy wywoływana jest EnumerationCompleted.

Zapisywanie urządzenia do późniejszego użycia

Dowolny obiekt DeviceInformation jest jednoznacznie identyfikowany przez kombinację dwóch informacji: DeviceInformation.Id i DeviceInformation.Kind. Jeśli zachowasz te dwie informacje, możesz ponownie utworzyć obiekt DeviceInformation po jego utracie, podając te informacje do metody CreateFromIdAsync. Jeśli to zrobisz, możesz zapisać preferencje użytkownika dla urządzenia zintegrowanego z aplikacją.