如何在 Windows 10 1903 上通过快捷方式打开和关闭蓝牙

如何在 Windows 10 1903 上通过快捷方式打开和关闭蓝牙

我想用快捷方式模拟以下过程:1)打开操作中心,2)单击蓝牙图标。

我的解决方案是使用 AHK 映射键盘快捷键来运行 .bat,其中包含此处建议的脚本问题

但是建议的服务不会激活/删除托盘栏中蓝牙的神奇小蓝色图标。在此处输入图片描述

我已经查找了在单击操作中心中的蓝牙图标时打开的所有蓝牙服务,并且已通过建议激活它们.bat,但它仍然不起作用。

BluetoothUserService_182d916
bthserv
BthHFSrv  
BthHFEnum  
BthEnum   
BthHFAud
BthEnum
BthA2dp
Microsoft_Bluetooth_AvrcpTransport

以下是所有服务: 在此处输入图片描述 在此处输入图片描述

我的脚本(其中我用上面提到的所有服务替换了 Microsoft_Bluetooth_AvrcpTransport):

@echo off

for /F "tokens=3 delims=: " %%H in ('sc query "Microsoft_Bluetooth_AvrcpTransport" ^| findstr "STATE"') do (
  if /I "%%H" NEQ "RUNNING" (
   net start "Microsoft_Bluetooth_AvrcpTransport"
  ) else if /I "%%H" NEQ "STOPPED" (
   net stop "Microsoft_Bluetooth_AvrcpTransport"
  )
)

@pause

答案1

首先创建一个.ahk启动 powershell 的快捷方式:

#b::
Run, C:\Users\user\Desktop\bluetooth.ps1,,Hide 
return

然后创建一个 powershell:

If ((Get-Service bthserv).Status -eq 'Stopped') { Start-Service bthserv }
Add-Type -AssemblyName System.Runtime.WindowsRuntime
$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0]
Function Await($WinRtTask, $ResultType) {
    $asTask = $asTaskGeneric.MakeGenericMethod($ResultType)
    $netTask = $asTask.Invoke($null, @($WinRtTask))
    $netTask.Wait(-1) | Out-Null
    $netTask.Result
}
[Windows.Devices.Radios.Radio,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null
[Windows.Devices.Radios.RadioAccessStatus,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null
Await ([Windows.Devices.Radios.Radio]::RequestAccessAsync()) ([Windows.Devices.Radios.RadioAccessStatus]) | Out-Null
$radios = Await ([Windows.Devices.Radios.Radio]::GetRadiosAsync()) ([System.Collections.Generic.IReadOnlyList[Windows.Devices.Radios.Radio]])
$bluetooth = $radios | ? { $_.Kind -eq 'Bluetooth' }
[Windows.Devices.Radios.RadioState,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null
if ($bluetooth.state -eq 'On') {$BluetoothStatus = 'Off'} else {$BluetoothStatus = 'On'}
Await ($bluetooth.SetStateAsync($BluetoothStatus)) ([Windows.Devices.Radios.RadioAccessStatus]) | Out-Null

所有功劳归于@Ben N@斯科特·希思


当我从 VScode 启动它、在 powershell 中复制粘贴它或使用 cmd 启动它时,此脚本可以正常工作。但当我双击它或在 中启动它时,它却不起作用。解决方法.ahk是创建一个.bat文件,其中包含以下内容

Run, C:\Users\user\Desktop\bluetooth.ps1,,Hide

然后.bat在 ahk 中调用它。

答案2

AutoHotkey v2.0 引入了一种用函数替换语句的新语法,因此接受的答案不再是复制粘贴的解决方案。

为了在 Windows 10.0.19045 上使用 AutoHotkey v2.0 实现此功能,我需要创建:

  1. 切换蓝牙.ahk
#b::
{
    Run( 'C:\Users\<user>\Documents\AutoHotkey\toggle-bluetooth.bat', , 'Hide' )
    return
}

(签名#b::将热键 Win+B 分配给此功能。请参阅AHK 文档了解符号的详细信息。

  1. 切换蓝牙.bat
powershell.exe -ExecutionPolicy Bypass -File toggle-bluetooth.ps1
  1. 切换蓝牙.ps1
If ((Get-Service bthserv).Status -eq 'Stopped') { Start-Service bthserv }
Add-Type -AssemblyName System.Runtime.WindowsRuntime
$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0]
Function Await($WinRtTask, $ResultType) {
    $asTask = $asTaskGeneric.MakeGenericMethod($ResultType)
    $netTask = $asTask.Invoke($null, @($WinRtTask))
    $netTask.Wait(-1) | Out-Null
    $netTask.Result
}
[Windows.Devices.Radios.Radio,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null
[Windows.Devices.Radios.RadioAccessStatus,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null
Await ([Windows.Devices.Radios.Radio]::RequestAccessAsync()) ([Windows.Devices.Radios.RadioAccessStatus]) | Out-Null
$radios = Await ([Windows.Devices.Radios.Radio]::GetRadiosAsync()) ([System.Collections.Generic.IReadOnlyList[Windows.Devices.Radios.Radio]])
$bluetooth = $radios | ? { $_.Kind -eq 'Bluetooth' }
[Windows.Devices.Radios.RadioState,Windows.System.Devices,ContentType=WindowsRuntime] | Out-Null
if ($bluetooth.state -eq 'On') {$BluetoothStatus = 'Off'} else {$BluetoothStatus = 'On'}
Await ($bluetooth.SetStateAsync($BluetoothStatus)) ([Windows.Devices.Radios.RadioAccessStatus]) | Out-Null

在其他方法中,使用作为中间人可能.bat是不必要的。但这是我唯一能做到的事情。

非常感谢@MagTun 和@rokdd 开发了这个解决方案。

答案3

您不需要停止/启动这些服务来摆脱蓝牙托盘栏图标。

图标的显示由注册表项中的 HKEY_CURRENT_USER\Control Panel\BluetoothDWORD 值控制, Notification Area Icon其值为0Off,1值为 On。这需要重新启动 Explorer 才能生效。

以下两个.bat文件将完成该工作。

禁用蓝牙通知区域图标

REG ADD "HKCU\Control Panel\Bluetooth" /V "Notification Area Icon" /T REG_DWORD /D 00000000 /F
taskkill /f /im explorer.exe
start explorer.exe

启用蓝牙通知区域图标

REG ADD "HKCU\Control Panel\Bluetooth" /V "Notification Area Icon" /T REG_DWORD /D 00000001 /F
taskkill /f /im explorer.exe
start explorer.exe

相关内容