[170] Bluetooth Radio Control on Windows 10

[170] Bluetooth Radio Control on Windows 10

先前提到控制 Bluetooth(藍牙)Radio 開關使用 UWP API。本篇把撞牆過程紀錄下來。

Win32 API is a Dead End

一開始先往 Win32 API 找,結果偏尋不著可以直接開關 Bluetooth Radio 的方法。使用 Win32 API 只可以查詢但無法改變 Bluetooth Radio 狀態,這點出乎我意料之外。找到最接近的可行之法(但其實有大缺陷)是使用 Setup API Enable/Disable Bluetooth 裝置。

這個方法在有 Bluetooth 裝置配對後即失效,而且會產生許多副作用(Side Effect),例如配對使用中的喇叭出聲怪音。失敗。

噁心的 UI Automation 解

由於 Windows 10 本身就有控制 Bluetooth 的介面,於是實作了「鍵盤模擬真人輸入的手法」來操控「設定」介面以達到開關 Bluetooth 的功效。步驟如下:

  1. 以 ms-settings:bluetooth 叫出 SystemSettings.exe 並直接進入 Bluetooth 控制頁,如附圖
  2. 以 SendInput 送出空白鍵
  3. 使用 TerminateProcess or taskkill.exe 來關閉 SystemSettings.exe

這個作法的壞處多如牛毛,太噁心,不可能用到正式產品。

Radio Manager API...?

接著找到一個 Radio Manager 的東東,官方有範例。但我東看西瞧,發現那不是我要的東西。依範例來看,是我要去實作該些介面(interface),讓其他人呼叫。其中,實作 IRadioInstance::SetRadioState 是為了讓其他人開關 Bluetooth...。所以,不是我要的,失敗。

UWP API To The Rescue

最後,皇天不負苦心人,找到了 UWP API——Windows.Devices.Radios

The members of this namespace allow your app to find and control radio adapters, like Wi-Fi and Bluetooth, on the device where your app runs, and to query those radios for certain attributes.。