[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 的功效。步驟如下:
- 以 ms-settings:bluetooth 叫出 SystemSettings.exe 並直接進入 Bluetooth 控制頁,如附圖
- 以 SendInput 送出空白鍵
- 使用 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.。