我想用快捷方式模拟以下过程: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
当我从 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 实现此功能,我需要创建:
- 切换蓝牙.ahk
#b::
{
Run( 'C:\Users\<user>\Documents\AutoHotkey\toggle-bluetooth.bat', , 'Hide' )
return
}
(签名#b::
将热键 Win+B 分配给此功能。请参阅AHK 文档了解符号的详细信息。
- 切换蓝牙.bat
powershell.exe -ExecutionPolicy Bypass -File toggle-bluetooth.ps1
- 切换蓝牙.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\Bluetooth
DWORD 值控制,
Notification Area Icon
其值为0
Off,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