Räkna upp enheter

Windows. Med API:erna Devices.Enumeration kan du hitta enheter som är internt anslutna till systemet, externt anslutna eller kan identifieras via trådlösa protokoll eller nätverksprotokoll.

Samples

Det enklaste sättet att räkna upp alla tillgängliga enheter är att ta en ögonblicksbild med kommandot FindAllAsync (förklaras ytterligare i ett avsnitt nedan).

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

Se exemplet för enhetsuppräkning och parkoppling för ett mer avancerat exempel på Windows.Devices.Enumeration-API:erna.

Uppräknings-API:er

Namnområdet Windows.Devices.Enumeration gör det möjligt för dig att hitta enheter som är internt anslutna till systemet, externt anslutna eller kan upptäckas via trådlösa protokoll eller nätverksprotokoll. Några av funktionerna som stöds av dessa API:er är:

  • Hitta en enhet att ansluta till med ditt program.
  • Få information om enheter som är anslutna till eller kan identifieras av systemet.
  • Låt en app ta emot meddelanden när enheter läggs till, ansluter, kopplar från, ändrar onlinestatus eller ändrar andra egenskaper.
  • Låt en app ta emot bakgrundsutlösare när enheter ansluter, kopplar från, ändrar onlinestatus eller ändrar andra egenskaper.

Dessa API:er kan räkna upp enheter över något av följande protokoll och bussar, förutsatt att den enskilda enheten och systemet som kör appen stöder den tekniken. Det här är inte en fullständig lista, och andra protokoll kan stödjas av en specifik enhet.

I många fall behöver du inte bekymra dig om att använda uppräknings-API:erna. Det beror på att många API:er som använder enheter automatiskt väljer lämplig standardenhet eller tillhandahåller ett mer effektiviserat uppräknings-API. Till exempel använder MediaElement automatiskt standardenheten för ljudåtergivning. Så länge din app kan använda standardenheten behöver du inte använda uppräknings-API:erna i ditt program. Uppräknings-API:erna ger dig ett allmänt och flexibelt sätt att identifiera och ansluta till tillgängliga enheter. Det här avsnittet innehåller information om att räkna upp enheter och beskriver de fyra vanliga sätten att räkna upp enheter.

  • Använda användargränssnittet DevicePicker
  • Räkna upp en ögonblicksbild av enheter som för närvarande kan identifieras av systemet
  • Räkna upp enheter som för närvarande kan identifieras och se efter ändringar
  • Räkna upp enheter som för närvarande kan identifieras och se efter ändringar i en bakgrundsaktivitet

DeviceInformation-objekt

När du arbetar med uppräknings-API:erna måste du ofta använda objekten DeviceInformation. De här objekten innehåller det mesta av den tillgängliga informationen om enheten. I följande tabell beskrivs några av de DeviceInformation-egenskaper som du kommer att vara intresserad av. En fullständig lista finns på referenssidan för DeviceInformation.

Property Comments
DeviceInformation.Id Detta är enhetens unika identifierare och tillhandahålls som en strängvariabel. I de flesta fall är detta ett ogenomskinliga värde som du bara skickar från en metod till en annan för att ange vilken enhet du är intresserad av. Du kan också använda den här egenskapen och egenskapen DeviceInformation.Kind när du har stängt appen och öppnat den igen. På så sätt kan du återställa och återanvända samma objekt DeviceInformation.
DeviceInformation.Kind Detta anger vilken typ av enhetsobjekt som representeras av objektet DeviceInformation. Det här är inte enhetskategorin eller typen av enhet. En enda enhet kan representeras av flera olika DeviceInformation-objekt av olika slag. Möjliga värden för den här egenskapen visas i DeviceInformationKind samt hur de relaterar till varandra.
DeviceInformation.Properties Den här egenskapssamlingen innehåller information som efterfrågas för objektet DeviceInformation. De vanligaste egenskaperna refereras enkelt till som egenskaper för DeviceInformation-objektet , till exempel med DeviceInformation.Name. Mer information finns i Egenskaper för enhetsinformation.

 

DevicePicker-användargränssnitt

DevicePicker är en kontroll som tillhandahålls av Windows som skapar ett litet användargränssnitt som gör att användaren kan välja en enhet i en lista. Den kan anpassas på några olika sätt, till exempel:

Även om DevicePicker visas, uppdateras innehållet i användargränssnittet automatiskt om enheterna läggs till, tas bort eller uppdateras.

Note

Du kan inte ange DeviceInformationKind med hjälp av DevicePicker. Om du vill ha enheter med en specifik DeviceInformationKind måste du skapa en DeviceWatcher och ange ett eget användargränssnitt.

Att casta medieinnehåll och DIAL har också var och en sina egna väljare om du vill använda dem. De är CastingDevicePicker och DialDevicePicker.

Räkna upp en ögonblicksbild av enheter

I vissa scenarier är DevicePicker inte lämplig för dina behov och du behöver något mer flexibelt. Du kanske vill skapa ett eget användargränssnitt eller behöver räkna upp enheter utan att visa användargränssnittet för användaren. I dessa situationer kan du räkna upp en ögonblicksbild av enheter. Detta innebär att titta igenom de enheter som för närvarande är anslutna till eller kopplade till systemet. Du måste dock vara medveten om att den här metoden bara tittar på en ögonblicksbild av enheter som är tillgängliga, så att du inte kan hitta enheter som ansluter när du har räknat upp via listan. Du meddelas inte heller om en enhet har uppdaterats eller tagits bort. En annan potentiell nackdel att vara medveten om är att den här metoden håller tillbaka alla resultat tills hela uppräkningen har slutförts. Därför bör du inte använda den här metoden när du är intresserad av AssociationEndpoint-, AssociationEndpointContainer- eller AssociationEndpointService-objekt eftersom de hittas via ett nätverk eller ett trådlöst protokoll. Det kan ta upp till 30 sekunder att slutföra. I det fallet bör du använda ett DeviceWatcher-objekt för att enumerera bland de möjliga enheterna.

Om du vill räkna upp via en ögonblicksbild av enheter använder du metoden FindAllAsync . Den här metoden väntar tills hela uppräkningsprocessen är klar och returnerar alla resultat som ett DeviceInformationCollection-objekt . Den här metoden är också överbelastad för att ge dig flera alternativ för att filtrera dina resultat och begränsa dem till de enheter som du är intresserad av. Du kan göra detta genom att ange en Enhetsklass eller skicka in en enhetsväljare. Enhetsväljaren är en AQS-sträng (Advanced Query Syntax) som anger de enheter som du vill räkna upp. Mer information finns i Skapa en enhetsväljare.

Förutom att begränsa resultatet kan du även ange de egenskaper som du vill hämta för enheterna. Om du gör det blir de angivna egenskaperna tillgängliga i egenskapsväskan för vart och ett av objekten DeviceInformation som returneras i samlingen. Observera att inte alla egenskaper är tillgängliga för alla enhetstyper. Information om vilka egenskaper som är tillgängliga för vilka enhetstyper finns i Egenskaper för enhetsinformation.

Lista och övervaka enheter

En mer kraftfull och flexibel metod för att räkna upp enheter är att skapa en DeviceWatcher. Det här alternativet ger störst flexibilitet när du räknar upp enheter. Det gör att du kan räkna upp enheter som för närvarande finns och även ta emot meddelanden när enheter som matchar enhetsväljaren läggs till, tas bort eller egenskaper ändras. När du skapar en DeviceWatcher anger du en enhetsväljare. Mer information om enhetsväljare finns i Skapa en enhetsväljare. När du har skapat bevakaren får du följande meddelanden för alla enheter som matchar dina angivna kriterier.

  • Lägg till meddelande när en ny enhet läggs till.
  • Uppdatera meddelande när en egenskap som du är intresserad av ändras.
  • Ta bort meddelande när en enhet inte längre är tillgänglig eller inte längre matchar filtret.

I de flesta fall där du använder en DeviceWatcher behåller du en lista över enheter och lägger till den, tar bort objekt från den eller uppdaterar objekt när bevakaren tar emot uppdateringar från de enheter som du tittar på. När du får ett uppdateringsmeddelande blir den uppdaterade informationen tillgänglig som ett DeviceInformationUpdate-objekt . Om du vill uppdatera listan över enheter letar du först rätt Enhetsinformation som har ändrats. Anropa sedan metoden Uppdatera för objektet och ange objektet DeviceInformationUpdate . Det här är en bekvämlighetsfunktion som automatiskt uppdaterar deviceinformation-objektet .

Eftersom en DeviceWatcher skickar meddelanden när enheterna anländer och när de ändras bör du använda den här metoden för att räkna upp enheter när du är intresserad av AssociationEndpoint, AssociationEndpointContainer eller AssociationEndpointService objekt eftersom de räknas upp via nätverksprotokoll eller trådlösa protokoll.

Om du vill skapa en DeviceWatcher använder du någon av metoderna CreateWatcher. Dessa metoder är överbelastade så att du kan ange de enheter som du är intresserad av. Du kan göra detta genom att ange en Enhetsklass eller skicka in en enhetsväljare. Enhetsväljaren är en AQS-sträng som anger vilka enheter du vill räkna upp. Mer information finns i Skapa en enhetsväljare. Du kan också ange de egenskaper som du vill hämta för enheterna och är intresserade av. Om du gör det blir de angivna egenskaperna tillgängliga i egenskapsväskan för vart och ett av objekten DeviceInformation som returneras i samlingen. Observera att inte alla egenskaper är tillgängliga för alla enhetstyper. Information om vilka egenskaper som är tillgängliga för vilka enhetstyper finns i Egenskaper för enhetsinformation

Titta på enheter som en bakgrundsaktivitet

Att titta på enheter som en bakgrundsaktivitet liknar att skapa en DeviceWatcher enligt beskrivningen ovan. I själva verket måste du fortfarande skapa ett normalt DeviceWatcher-objekt först enligt beskrivningen i föregående avsnitt. När du har skapat den anropar du GetBackgroundTrigger i stället för DeviceWatcher.Start. När du anropar GetBackgroundTrigger måste du ange vilka av de meddelanden du är intresserad av: lägga till, ta bort eller uppdatera. Du kan inte begära uppdatering eller ta bort utan att begära tillägg också. När du registrerar utlösaren börjar DeviceWatcher köras direkt i bakgrunden. Från och med nu, när den får ett nytt meddelande för ditt program som matchar dina kriterier, utlöses bakgrundsaktiviteten och du får de senaste ändringarna sedan programmet senast utlöstes.

Important

Första gången som en DeviceWatcherTrigger utlöser ditt program sker när den når EnumerationCompleted-tillståndet. Det innebär att den innehåller alla de första resultaten. Varje gång den utlöser din applikation i framtiden kommer den bara att innehålla aviseringar om tillägg, uppdateringar och borttagningar som har inträffat sedan den senaste utlösningen. Detta skiljer sig något från ett förgrundsobjekt DeviceWatcher eftersom de första resultaten inte kommer in en i taget och endast levereras i ett paket efter EnumerationCompleted nås.

Vissa trådlösa protokoll fungerar annorlunda om de skannar i bakgrunden jämfört med förgrunden, eller om de kanske inte har stöd för genomsökning i bakgrunden alls. Det finns tre möjligheter med relation till bakgrundsgenomsökning. I följande tabell visas de möjligheter och vilka effekter detta kan ha på ditt program. Bluetooth och Wi-Fi Direct stöder till exempel inte bakgrundsgenomsökningar, så i tillägg stöder de inte en DeviceWatcherTrigger.

Behavior Påverkan
Samma beteende i bakgrunden None
Endast passiva genomsökningar är möjliga i bakgrunden Det kan ta längre tid att identifiera enheten i väntan på att en passiv genomsökning ska utföras.
Bakgrundsgenomsökningar stöds inte Inga enheter kan identifieras av DeviceWatcherTrigger och inga uppdateringar rapporteras.

 Om din DeviceWatcherTrigger innehåller ett protokoll som inte stöder inläsning som en bakgrundsaktivitet, fungerar utlösaren fortfarande. Du kommer dock inte att kunna få några uppdateringar eller resultat över det protokollet. Uppdateringarna för andra protokoll eller enheter identifieras fortfarande normalt.

Använda DeviceInformationKind

I de flesta fall behöver du inte bekymra dig om DeviceInformationKind för ett Enhetsinformation objekt. Det beror på att enhetsväljaren som returneras av enhets-API:et som du använder ofta garanterar att du får rätt typer av enhetsobjekt att använda med deras API. I vissa scenarier vill du dock hämta DeviceInformation för enheter, men det finns inget motsvarande enhets-API för att tillhandahålla en enhetsväljare. I dessa fall behöver du bygga din egen selektor. Webbtjänster på enheter har till exempel inget dedikerat API, men du kan identifiera dessa enheter och få information om dem med hjälp av Windows. Devices.Enumeration API:er och sedan använda dem med hjälp av socket-API:erna.

Om du skapar en egen enhetsväljare för att gå igenom enhetsobjekt, är DeviceInformationKind viktigt att du förstår. Alla möjliga typer, samt hur de relaterar till varandra, beskrivs på referenssidan för DeviceInformationKind. En av de vanligaste användningsområdena för DeviceInformationKind är att ange vilken typ av enheter du söker efter när du skickar en fråga tillsammans med en enhetsväljare. Genom att göra detta ser du till att du bara räknar upp över enheter som matchar den angivna DeviceInformationKind. Du kan till exempel hitta ett DeviceInterface-objekt och sedan köra en fråga för att hämta informationen för det överordnade enhetsobjektet . Det överordnade objektet kan innehålla ytterligare information.

Observera att egenskaperna som är tillgängliga i egenskapsväskan för ett DeviceInformation-objekt varierar beroende på enhetens DeviceInformationKind. Vissa egenskaper är endast tillgängliga med vissa typer. Mer information om vilka egenskaper som är tillgängliga för vilka typer finns i Egenskaper för enhetsinformation. I exemplet ovan ger sökning efter den överordnade enheten dig därför åtkomst till mer information som inte var tillgänglig från DeviceInterface-enhetsobjektet . Därför är det viktigt att se till att de begärda egenskaperna är tillgängliga för de DeviceInformationKind-objekt som du räknar upp när du skapar AQS-filtersträngarna. Mer information om hur du skapar ett filter finns i Skapa en enhetsväljare.

När du räknar upp AssociationEndpoint-, AssociationEndpointContainer- eller AssociationEndpointService-objekt räknas du upp via ett protokoll för trådlöst nätverk eller nätverk. I dessa situationer rekommenderar vi att du inte använder FindAllAsync och i stället använder CreateWatcher. Detta beror på att sökning via ett nätverk ofta leder till sökåtgärder som inte får timeout förrän efter 10 sekunder eller mer innan EnumerationCompleted genereras. FindAllAsync slutför inte åtgärden förrän EnumerationCompleted har utlösts. Om du använder en DeviceWatcher får du resultat närmare realtid oavsett när EnumerationCompleted anropas.

Spara en enhet för senare användning

Alla DeviceInformation objekt identifieras unikt genom en kombination av två informationsdelar: DeviceInformation.Id och DeviceInformation.Kind. Om du behåller dessa två informationsdelar kan du återskapa ett DeviceInformation-objekt när det har förlorats genom att ange den här informationen i CreateFromIdAsync. Om du gör det kan du spara användarinställningar för en enhet som integreras med din app.