列舉服務點裝置
本主題示範如何定義用來查詢系統可用裝置的裝置選取器,並使用這個選取器來列舉使用下列其中一種方法的服務點裝置:
方法 1:使用裝置選擇器
顯示裝置選擇器 UI,並讓使用者選擇連線的裝置。 此方法在連接和移除裝置時處理更新清單,並且比其他方法更簡單、更安全。
方法 2:取得第一個可用的裝置
使用 GetDefaultAsync 存取特定服務點裝置類別中的第一個可用裝置。
方法 3:裝置快照集
列舉給定時間點系統上存在的服務點裝置的快照。 當您想要建立自己的 UI 或需要列舉裝置而不向使用者顯示 UI 時,這非常有用。 FindAllAsync 會保留結果,直到整個列舉完成為止。
方法 4:列舉和監看
DeviceWatcher 是一種功能更強大且更有彈性的列舉模型,可讓您列舉目前存在的裝置,並在從系統中新增或移除裝置時接收通知。 當您想要在背景維護目前的裝置清單以便在 UI 中顯示而不是等待快照發生時,這非常有用。
定義裝置選擇器
裝置選擇器使您能夠在列舉裝置時限制正在搜尋的裝置。 這使您可以僅獲得相關結果,並減少列舉所需裝置所需的時間。
您可以針對您要尋找的裝置類型使用 GetDeviceSelector 方法,並取得該類型的裝置選取器。 例如,使用 PosPrinter.GetDeviceSelector 會為您提供選取器,以列舉連接至系統的所有 PosPrinter,包括 USB、網路和 藍牙 POS 印表機。
using Windows.Devices.PointOfService;
string selector = POSPrinter.GetDeviceSelector();
不同裝置類型的 GetDeviceSelector 方法如下:
- BarcodeScanner.GetDeviceSelector
- CashDrawer.GetDeviceSelector
- LineDisplay.GetDeviceSelector
- MagneticStripeReader.GetDeviceSelector
- PosPrinter.GetDeviceSelector
使用將 PosConnectionTypes 值作為參數的 GetDeviceSelector 方法,您可以限制選擇器列舉本機、網路或藍牙連接的 POS 裝置,從而減少完成查詢所需的時間。 下列範例示範如何使用此方法來定義只支援本機連結 POS 印表機的選取器。
using Windows.Devices.PointOfService;
string selector = POSPrinter.GetDeviceSelector(PosConnectionTypes.Local);
提示
請參閱建置裝置選取器,以建置更進階的選取器字元串。
方法 1:使用裝置選擇器
DevicePicker 類別可讓您顯示選擇器飛出視窗,其中包含可供使用者選擇的裝置清單。 您可以使用 Filter 屬性來選擇要在選擇器中顯示的裝置類型。 此屬性的類型為 DevicePickerFilter。 您可以使用 SupportedDeviceClasses 或 SupportedDeviceSelectors 屬性將裝置類型新增至篩選器。
當您準備好顯示裝置選擇器時,您可以呼叫 PickSingleDeviceAsync 方法,此方法會顯示選擇器 UI 並傳回選取的裝置。 您必須指定 Rect,判斷飛出視窗出現的位置。 這個方法會傳回 DeviceInformation 物件,因此若要將它與服務點 API 搭配使用,您必須針對您想要的特定裝置類別使用 FromIdAsync 方法。 您可以傳遞 DeviceInformation.Id 屬性做為方法的 deviceId 參數,並取得裝置類別的執行個體做為傳回值。
下列代碼段會 建立 DevicePicker、新增條碼掃描器篩選、讓使用者挑選裝置,然後根據裝置標識元建立 BarcodeScanner 物件:
private async Task<BarcodeScanner> GetBarcodeScanner()
{
DevicePicker devicePicker = new DevicePicker();
devicePicker.Filter.SupportedDeviceSelectors.Add(BarcodeScanner.GetDeviceSelector());
Rect rect = new Rect();
DeviceInformation deviceInformation = await devicePicker.PickSingleDeviceAsync(rect);
BarcodeScanner barcodeScanner = await BarcodeScanner.FromIdAsync(deviceInformation.Id);
return barcodeScanner;
}
方法 2:取得第一個可用的裝置
取得服務點裝置最簡單的方式是使用 GetDefaultAsync 取得服務點裝置類別內的第一個可用裝置。
下列範例說明使用適用於 BarcodeScanner 的 GetDefaultAsync。 所有服務點裝置類別的程式碼撰寫模式都類似。
using Windows.Devices.PointOfService;
BarcodeScanner barcodeScanner = await BarcodeScanner.GetDefaultAsync();
警告
GetDefaultAsync 必須小心使用,因為它可能會從一個會話傳回不同的裝置到下一個會話。 許多事件可能會影響此列舉,導致不同的第一個可用裝置,包括:
- 連接到電腦的相機變更
- 連結至電腦的服務點裝置變更
- 在您的網路上可用的網路連接點服務裝置變更
- 藍牙 計算機範圍內的服務點裝置變更
- 對服務點配置的更改
- 安裝驅動程式或 OPOS 服務物件
- 安裝服務點擴充功能
- 更新至 Windows 作業系統
方法 3:裝置快照集
在某些情況下,您可能想要建立自己的 UI 或需要列舉裝置而不向使用者顯示 UI。 在這些情況下,您可以使用 DeviceInformation.FindAllAsync 列舉目前連線或與系統配對的裝置快照集。 這個方法會保留任何結果,直到整個列舉完成為止。
提示
當使用 FindAllAsync 將查詢限制為所需的連線類型時,建議使用 GetDeviceSelector 方法搭配 PosConnectionTypes 參數。 網路和 藍牙 連線可能會延遲結果,因為其列舉必須在 FindAllAsync 結果傳回之前完成。
警告
FindAllAsync 會傳回裝置陣列。 此陣列的順序可能會因工作階段而異,因此不建議透過在陣列中使用硬編碼索引來依賴特定順序。 使用 DeviceInformation 屬性來篩選結果,或提供 UI 供使用者選擇。
此範例會使用上述定義的選取器來擷取使用 FindAllAsync 來擷取裝置的快照集,然後列舉集合傳回的每個專案,並將裝置名稱和識別碼寫入偵錯輸出。
using Windows.Devices.Enumeration;
DeviceInformationCollection deviceCollection = await DeviceInformation.FindAllAsync(selector);
foreach (DeviceInformation devInfo in deviceCollection)
{
Debug.WriteLine("{0} {1}", devInfo.Name, devInfo.Id);
}
提示
使用 Windows.Devices.Enumeration API 時,您經常需要使用 DeviceInformation 物件來取得特定裝置的相關資訊。 例如,如果 DeviceInformation.ID 屬性可在未來的會話中使用,而且 DeviceInformation.Name 屬性可用於應用程式中的顯示用途,則可以使用 DeviceInformation.ID 屬性來復原及重複使用相同的裝置。 如需其他可用屬性的詳細資訊,請參閱 DeviceInformation 參考頁面。
方法 4:列舉和監看
一種更強大、更靈活的裝置列舉方法是建立 DeviceWatcher。 裝置監看員會動態列舉裝置,以便在初始列舉完成後新增、移除或變更裝置時,應用程式會收到通知。 DeviceWatcher 可讓您偵測網路連線裝置何時上線、藍牙裝置在範圍內,以及本機連線的裝置是否已取消移轉,讓您可以在應用程式內採取適當的動作。
此範例會使用上面定義的選取器來建立 DeviceWatcher,以及定義已新增、移除和更新通知的事件處理常式。 您必須填寫您想要在每個通知時採取的動作詳細資料。
using Windows.Devices.Enumeration;
DeviceWatcher deviceWatcher = DeviceInformation.CreateWatcher(selector);
deviceWatcher.Added += DeviceWatcher_Added;
deviceWatcher.Removed += DeviceWatcher_Removed;
deviceWatcher.Updated += DeviceWatcher_Updated;
void DeviceWatcher_Added(DeviceWatcher sender, DeviceInformation args)
{
// TODO: Add the DeviceInformation object to your collection
}
void DeviceWatcher_Removed(DeviceWatcher sender, DeviceInformationUpdate args)
{
// TODO: Remove the item in your collection associated with DeviceInformationUpdate
}
void DeviceWatcher_Updated(DeviceWatcher sender, DeviceInformationUpdate args)
{
// TODO: Update your collection with information from DeviceInformationUpdate
}
提示
如需使用 DeviceWatcher 的詳細資訊,請參閱列舉和監看裝置。
另請參閱
- 開始使用服務點
- DeviceInformation 類別
- PosPrinter Class
- PosConnectionTypes Enum
- BarcodeScanner Class
- DeviceWatcher Class
支援和意見反應
尋找您的問題解答
有任何疑問嗎? 在具有UWP標籤的 Docs Q&A 論壇上,或使用 pointofservice 標籤在 Stack Overflow 上詢問我們。
協助我們找出您的問題:
- 將 pointofservice 標籤新增至 Stack Overflow 的問題。
- 在 問&答論壇的貼文中包含 「UWP」 字詞