Как включить и выключить Bluetooth с помощью ярлыка в Windows 10 1903?

Как включить и выключить Bluetooth с помощью ярлыка в Windows 10 1903?

Я хотел бы с помощью ярлыка эмулировать процесс 1) открытия Центра уведомлений и 2) нажатия на значок Bluetooth.

Моим решением было использовать AHK для назначения сочетания клавиш для запуска .bat, который содержит скрипт, предложенный в этомвопрос.

Но предложенная служба не активирует/не удаляет волшебный маленький синий значок Bluetooth на панели задач.введите описание изображения здесь

Я просмотрел все службы Bluetooth, которые включаются при нажатии на значок Bluetooth в Центре уведомлений, и активировал их с помощью предложенных действий .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

Сначала создайте.ахкЯрлык, запускающий 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 представляет новый синтаксис, который заменяет операторы функциями, поэтому принятый ответ больше не является решением типа «копировать и вставить».

Чтобы реализовать это с помощью AutoHotkey v2.0 на Windows 10.0.19045, мне нужно было создать:

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

(В подписи #b::для этой функции назначена горячая клавиша Win+B. См.Документы AHK(Подробнее об обозначениях см.

  1. toggle-bluetooth.bat
powershell.exe -ExecutionPolicy Bypass -File toggle-bluetooth.ps1
  1. toggle-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

Вполне возможно, что использование .batв качестве посредника не является необходимым при каком-то другом подходе. Но это единственное, что я смог заставить работать.

Очевидная благодарность @MagTun и @rokdd за разработку этого решения.

решение3

Вам не нужно останавливать/запускать эти службы, чтобы избавиться от значка Bluetooth на панели задач.

Отображение значка контролируется в разделе реестра HKEY_CURRENT_USER\Control Panel\Bluetooth, значением DWORD, Notification Area Iconзначение которого может быть 0Off и 1On. Для вступления изменений в силу требуется перезапуск Explorer.

.batДля этой цели подойдут следующие два файла.

Отключить значок 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

Включить значок области уведомлений 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

Связанный контент