
Me gustaría emular con un acceso directo el proceso de 1) abrir el Centro de actividades y 2) hacer clic en el ícono de bluetooth.
Mi solución fue usar AHK para asignar un método abreviado de teclado para ejecutar un .bat, que contiene el script sugerido en estepregunta.
Pero el servicio sugerido no activa/elimina el pequeño ícono azul mágico del bluetooth en la barra de la bandeja.ingrese la descripción de la imagen aquí
Busqué todos los servicios de Bluetooth que se activan cuando hago clic en el ícono de Bluetooth en el centro de actividades y los activé a través de lo sugerido .bat
, pero aún así no funciona.
BluetoothUserService_182d916
bthserv
BthHFSrv
BthHFEnum
BthEnum
BthHFAud
BthEnum
BthA2dp
Microsoft_Bluetooth_AvrcpTransport
Aquí están todos los servicios:
Mi script (donde reemplacé Microsoft_Bluetooth_AvrcpTransport por todos los servicios mencionados anteriormente):
@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
Respuesta1
Primero crea un.ahkacceso directo que inicia un powershell:
#b::
Run, C:\Users\user\Desktop\bluetooth.ps1,,Hide
return
Luego creas un 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
Todo el crédito va a@Ben N.y@Scott Heath
Este script funciona cuando lo ejecuto desde VScode, cuando lo copio y pego en un powershell o cuando uso un cmd para iniciarlo. Pero no cuando hago doble clic en él o cuando lo inicio en .ahk
. La solución fue crear un .bat
archivo con este
Run, C:\Users\user\Desktop\bluetooth.ps1,,Hide
Y luego llama a esto .bat
en ahk.
Respuesta2
AutoHotkey v2.0 introduce una nueva sintaxis que reemplaza declaraciones con funciones, por lo que la respuesta aceptada ya no es una solución de copiar y pegar.
Para lograr esto con AutoHotkey v2.0 en Windows 10.0.19045, necesitaba crear:
- alternar-bluetooth.ahk
#b::
{
Run( 'C:\Users\<user>\Documents\AutoHotkey\toggle-bluetooth.bat', , 'Hide' )
return
}
(La firma #b::
asigna la tecla de acceso rápido Win+B a esta función. Consulte ladocumentos AHKpara obtener detalles sobre la notación.)
- alternar-bluetooth.bat
powershell.exe -ExecutionPolicy Bypass -File toggle-bluetooth.ps1
- alternar-bluetooth.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
Es muy posible que utilizarlo .bat
como intermediario no sea necesario con algún otro enfoque. Pero esto es lo único que pude poner a trabajar.
Obviamente gracias a @MagTun y @rokdd por desarrollar esta solución.
Respuesta3
No es necesario detener/iniciar estos servicios para deshacerse del icono de la barra de bandeja de Bluetooth.
La visualización del icono se controla en la clave de registro
HKEY_CURRENT_USER\Control Panel\Bluetooth
, mediante el valor DWORD
Notification Area Icon
cuyo valor es 0
para Off y 1
para On. Esto requiere reiniciar Explorer para que surta efecto.
Los siguientes dos .bat
archivos harán el trabajo.
Deshabilite el ícono del área de notificación de Bluetooth
REG ADD "HKCU\Control Panel\Bluetooth" /V "Notification Area Icon" /T REG_DWORD /D 00000000 /F
taskkill /f /im explorer.exe
start explorer.exe
Habilite el ícono del área de notificación de Bluetooth
REG ADD "HKCU\Control Panel\Bluetooth" /V "Notification Area Icon" /T REG_DWORD /D 00000001 /F
taskkill /f /im explorer.exe
start explorer.exe