WIN10 蓝牙无法删除解决方案

背景

两台电脑互换了无线网卡:

  1. A 电脑:AX200 => RTL8828BE
  2. B 电脑:RTL8828BE => AX200

新的 Xbox 手柄链接到 B 电脑上成功,删除旧的 Xbox 手柄无线设备失败,在设备管理器里查看 - 显示隐藏的设备 - 蓝牙,找到未连接的 Xbox 手柄删除成功,B 电脑完毕。
A 电脑重复以上操作后,在 A 电脑的蓝牙连接池里面有 Xbox 设备显示已配对,但是不管是开启设备配对,或是激活手柄电脑重新搜索均失败,途中测试拿旧手柄连接 B 电脑成功。判断是 A 电脑的蓝牙模块设置出了问题,旧手柄连接在了一个虚拟的蓝牙枚举器上,光是在设备管理器里面删除设备并不管用。过段时间或是重启电脑又会出现,且因为旧手柄的设备码已连接,重新配对时 A 电脑均搜索不到手柄。

解决办法

  1. 尝试在蓝牙设置、设备管理器、打印机与设备重复删除,无用
  2. 尝试重装网卡启动,无用
  3. 尝试重装蓝牙驱动,RTL 官网驱动下载速度太慢,下载到一半使用其他方案完成,于是取消下载

成功方案为在 power shell 里运行了一段代码,代码逻辑是搜索电脑配对的蓝牙设备,根据编号选择后,调用底层方法删除该蓝牙设备,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$Source = @"
[DllImport("BluetoothAPIs.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.U4)]
static extern UInt32 BluetoothRemoveDevice(IntPtr pAddress);

public static UInt32 Unpair(UInt64 BTAddress) {
GCHandle pinnedAddr = GCHandle.Alloc(BTAddress, GCHandleType.Pinned);
IntPtr pAddress = pinnedAddr.AddrOfPinnedObject();

UInt32 result = BluetoothRemoveDevice(pAddress);
pinnedAddr.Free();
return result;
}
"@

Function Get-BTDevice {
Get-PnpDevice -class Bluetooth |
?{$_.HardwareID -match 'DEV_'} |
select Status, Class, FriendlyName, HardwareID,
# Extract device address from HardwareID
@{N='Address';E={[uInt64]('0x{0}' -f $_.HardwareID[0].Substring(12))}}
}

################## Execution Begins Here ################

$BTR = Add-Type -MemberDefinition $Source -Name "BTRemover" -Namespace "BStuff" -PassThru
$BTDevices = @(Get-BTDevice) # Force array if null or single item
Do {
If ($BTDevices.Count) {
"`n******** Bluetooth Devices ********`n" | Write-Host
For ($i=0; $i -lt $BTDevices.Count; $i++) {
('{0,5} - {1}' -f ($i+1), $BTDevices[$i].FriendlyName) | Write-Host
}
$selected = Read-Host "`nSelect a device to remove (0 to Exit)"
If ([int]$selected -in 1..$BTDevices.Count) {
'Removing device: {0}' -f $BTDevices[$Selected-1].FriendlyName | Write-Host
$Result = $BTR::Unpair($BTDevices[$Selected-1].Address)
If (!$Result) {"Device removed successfully." | Write-Host}
Else {"Sorry, an error occured." | Write-Host}
}
}
Else {
"`n********* No devices foundd ********" | Write-Host
}
} While (($BTDevices = @(Get-BTDevice)) -and [int]$selected)

选择完设备后,虽然提示信息为 "Sorry, an error occured.",但是在蓝牙界面配对已经可以搜索到旧 Xbox 手柄,问题解决。

搜索资料时跟该方案列在一起的还有一 yarn 个方案如下:

  1. 下载修复工具,一路默认选项完成安装
  2. 打开 PowerShell,命令行输入 btpair -u,回车执行
  3. 等待一会,就可以去设置把蓝牙设备删除了
    在无法删除设备时在 B 电脑上尝试无用,故没有选择在 A 电脑上使用