¿Cómo puedo activar y desactivar Bluetooth mediante un acceso directo en Windows 10 1903?

¿Cómo puedo activar y desactivar Bluetooth mediante un acceso directo en Windows 10 1903?

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: ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

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 .batarchivo con este

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

Y luego llama a esto .baten 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:

  1. 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.)

  1. alternar-bluetooth.bat
powershell.exe -ExecutionPolicy Bypass -File toggle-bluetooth.ps1
  1. 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 .batcomo 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 Iconcuyo valor es 0para Off y 1para On. Esto requiere reiniciar Explorer para que surta efecto.

Los siguientes dos .batarchivos 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

información relacionada