枚举 Point of Service 设备

本主题演示了如何 定义用于查询系统可用的设备的设备选择器,并使用此选择器使用以下方法之一枚举服务点设备:

方法 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 方法包括:

使用将 PosConnectionTypes 值作为参数的 GetDeviceSelector 方法,你可以将选择器限制为枚举本地、网络或连接蓝牙的 POS 设备,减少完成查询所需的时间。 下面的示例显示如何使用此方法来定义只支持本地连接的 POS 打印机的选择器。

using Windows.Devices.PointOfService;

string selector = POSPrinter.GetDeviceSelector(PosConnectionTypes.Local);

提示

请参阅构建设备选择器,以构建更高级的选择器字符串。

方法 1:使用设备选取器

可以通过 DevicePicker 类显示一个选取器浮出控件,其中包含供用户选择的设备列表。 可以使用 Filter 属性选择要在选取器中显示的设备类型。 此属性的类型为 DevicePickerFilter。 可以使用 SupportedDeviceClassesSupportedDeviceSelectors 属性将设备类型添加到筛选器。

准备好显示设备选取器后,可以调用 PickSingleDeviceAsync 方法,该方法会显示选取器 UI 并返回所选设备。 需要指定一个 Rect,用于确定显示浮出控件的位置。 此方法会返回 DeviceInformation 对象,因此,若要将该对象与服务点 API 配合使用,需要对所需的特定设备类使用 FromIdAsync 方法。 将 DeviceInformation.Id 属性作为方法的 deviceId 参数传递,并获取设备类的实例作为返回值。

以下代码片段创建 DevicePicker,向它添加条形码扫描仪筛选器,让用户选取设备,然后基于设备 ID 创建 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 来获取服务点设备类内的第一个可用设备。

下面的示例显示如何使用 GetDefaultAsync 来获取 BarcodeScanner。 所有服务点设备类的编码模式都是相似的。

using Windows.Devices.PointOfService;

BarcodeScanner barcodeScanner = await BarcodeScanner.GetDefaultAsync();

注意

GetDefaultAsync 必须小心使用,因为它可能会将一个会话的不同设备返回到下一个会话。 许多事件可能会影响此枚举,从而导致不同的第一个可用设备,包括:

  • 计算机连接的相机更改
  • 连接到计算机的服务点设备更改
  • 网络中可用的网络连接服务点设备更改
  • 计算机范围内的蓝牙服务点设备更改
  • 对服务点配置的更改
  • 安装驱动程序或 OPOS 服务对象
  • 安装服务点扩展
  • 更新到 Windows 操作系统

方法 3:设备的快照

在某些情况下,你可能想要构建自己的 UI 或需要枚举设备,而不向用户显示 UI。 在这些情况下,可以使用 DeviceInformation.FindAllAsync枚举当前已连接或与系统配对的设备快照。 此方法会将结果保留到整个枚举完成。

提示

在使用 FindAllAsync 将查询限制为所需的连接类型时,建议使用具有 PosConnectionTypes 参数的 GetDeviceSelector 方法。 网络和蓝牙连接可能延迟结果,因为它们的枚举必须在返回 FindAllAsync 结果前完成。

注意

FindAllAsync 返回设备数组。 该数组的顺序可能会因会话而异,因此不建议通过在数组中使用硬编码索引来依赖特定顺序。 使用 DeviceInformation 属性筛选结果或为用户提供可供选择的 UI。

此示例使用上面定义的选择器来使用 FindAllAsync 获取设备快照,然后通过集合返回的每个项目进行枚举,并将设备名称和 ID 写入调试输出。

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 参考页。

方法 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

另请参阅

支持和反馈

查找问题的答案

有问题? 请在文档问答论坛上使用 UWP 标记或在 Stack Overflow 上使用 pointofservice 标记向我们提问。

帮助我们找到你的问题:

  • 在 Stack Overflow 上,将 pointofservice 标记添加到你的问题中。
  • 在问答论坛上,将“UWP”一词添加到你的帖子中