【问题标题】:How do we change Wireless Bluetooth Radio Power Management Programmatically C#我们如何以编程方式更改无线蓝牙无线电电源管理 C#
【发布时间】:2019-12-28 10:43:55
【问题描述】:

我在使用使用外部蓝牙设备的应用时遇到问题。当设备空闲一段时间 Windows 打开蓝牙无线电的电源。当我取消选中蓝牙无线电的电源管理选项卡下[允许计算机关闭此设备以节省电源。]它可以工作。见图片。 同样需要从 C# 代码中实现。这需要从 Win7 开始执行。 我不熟悉 windows c# 的电源管理选项。我在这里有什么选择?是否有我可以使用的事件或 WMI 类?

当我的 WPF 应用程序运行时,我应该能够更改这些设置。并在关闭时恢复。

【问题讨论】:

  • 您是否为 BT com 使用外部库?是否适用于 Winforms、WPF、UWP?
  • 不,我没有使用任何外部库。 System.IO.Ports 串行端口。我在问题中提到的 WPF 应用程序。请看。
  • 我在快速谷歌上找到的所有东西似乎都在宣传某个图书馆 (32feet.net)。原生方法似乎很麻烦。
  • @Fildor 蓝牙或通信没有问题。你读过这个问题吗?请建议有哪些选项可以让 32 英尺图书馆中的收音机保持活力?
  • 这可能通过注册表操作来完成,但这需要用户具有注册表编辑权限。 windows10skill.com/…

标签: c# wpf bluetooth windows-7 power-management


【解决方案1】:

您可以使用 C# 中的 WMI 轻松完成此操作。确保添加对 System.Management 的引用(以及 using System.Management; 语句)

    //BTHUSB will identify physical bluetooth adapters only, if you want all bluetooth devices use 'WHERE PNPClass='Bluetooth' or specific device 'WHERE Name='Intel(R) Wireless Bluetooth(R)'
    ManagementObjectCollection PhysicalBluetoothAdapterResults = new ManagementObjectSearcher("root\\CIMV2", "SELECT DeviceID FROM Win32_PnPEntity WHERE Service='BTHUSB'").Get();
    foreach(ManagementObject PhysicalBluetoothAdapter in PhysicalBluetoothAdapterResults)
    {
        string DeviceID = PhysicalBluetoothAdapter.Properties["DeviceID"].Value.ToString().Replace("\\","\\\\");
        ManagementObjectCollection AdapterPowerOptionResults = new ManagementObjectSearcher("root\\WMI", $"SELECT * FROM MSPower_DeviceEnable WHERE InstanceName LIKE '{DeviceID}_%'").Get();
        foreach(ManagementObject AdapterPowerOption in AdapterPowerOptionResults)
        {
            AdapterPowerOption.Properties["enable"].Value = false;
            AdapterPowerOption.Put();
        }
    }

希望这会有所帮助。

-保罗

【讨论】:

  • 太棒了。为此,我们需要提升特权。这回答了我的问题。不过还是要试试win7。谢谢@Paul G
  • 嘿,sPS 是的,不幸的是,需要提升权限。对于我所有的环境操作系统(Win 7、8,1、10 1709-1903),此代码“在我的机器上运行”。此代码包含 pnpdevice->instancename 转换的惰性解决方法,但您可以使用 ROOT\WMI 中的 MSWmi_PnPInstanceNames 类获取绝对实例名称
【解决方案2】:

Windows 10 API 确实有可以轻松打开蓝牙无线电的方法:

using Windows.Devices.Radios;

var bluetoothRadio = Radio.GetRadiosAsync().AsTask().Result.
    First(r => r.Kind == RadioKind.Bluetooth);

_bluetoothRadio.SetStateAsync(RadioState.On);

请注意,为了使用这些 API,需要对 Windows.winmd 的程序集引用。看看Carter's answer

更新: 看起来Win 10 SDK引用也可以通过安装Microsoft.Windows.SDK.ContractsNuGet package来添加。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2022-11-17
    • 2012-03-31
    • 2017-12-24
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多