Wie kann ich Bluetooth über eine Verknüpfung unter Windows 10 1903 ein- und ausschalten?

Wie kann ich Bluetooth über eine Verknüpfung unter Windows 10 1903 ein- und ausschalten?

Ich möchte den Vorgang 1) Öffnen des Action Centers und 2) Klicken auf das Bluetooth-Symbol mit einer Verknüpfung emulieren.

Meine Lösung bestand darin, AHK zu verwenden, um eine Tastenkombination zum Ausführen einer .bat-Datei zuzuordnen, die das in diesem Artikel vorgeschlagene Skript enthält.Frage.

Aber der vorgeschlagene Dienst aktiviert/entfernt nicht das magische kleine blaue Bluetooth-Symbol in der Taskleiste.Bildbeschreibung hier eingeben

Ich habe nach allen Bluetooth-Diensten gesucht, die aktiviert werden, wenn ich im Info-Center auf das Bluetooth-Symbol klicke, und ich habe sie über die vorgeschlagene Methode aktiviert .bat, aber es funktioniert immer noch nicht.

BluetoothUserService_182d916
bthserv
BthHFSrv  
BthHFEnum  
BthEnum   
BthHFAud
BthEnum
BthA2dp
Microsoft_Bluetooth_AvrcpTransport

Hier alle Leistungen im Überblick: Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Mein Skript (in dem ich Microsoft_Bluetooth_AvrcpTransport durch alle oben genannten Dienste ersetzt habe):

@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

Antwort1

Erstellen Sie zunächst eine.ahkVerknüpfung, die eine Powershell startet:

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

Anschließend erstellt man eine 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

Der ganze Verdienst gebührt@Ben NUnd@Scott Heath


Dieses Skript funktioniert, wenn ich es von VScode aus starte, wenn ich es in eine Powershell kopiere und einfüge oder wenn ich es mit cmd starte. Aber nicht, wenn ich darauf doppelklicke oder wenn ich es in starte . Die Lösung bestand darin, eine Datei mit folgendem .ahkzu erstellen:.bat

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

Und rufen Sie dies dann .batin ahk auf.

Antwort2

AutoHotkey v2.0 führt eine neue Syntax ein, die Anweisungen durch Funktionen ersetzt, sodass die akzeptierte Antwort keine Copy-and-Paste-Lösung mehr ist.

Um dies mit AutoHotkey v2.0 unter Windows 10.0.19045 durchzuführen, musste ich Folgendes erstellen:

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

(Die Signatur #b::weist dieser Funktion den Hotkey Win+B zu. Siehe dieAHK-Dokumentefür Einzelheiten zur Notation.)

  1. toggle-bluetooth.bat
powershell.exe -ExecutionPolicy Bypass -File toggle-bluetooth.ps1
  1. Umschalten von 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 ist durchaus möglich, dass die Verwendung .batals Mittelsmann bei einem anderen Ansatz nicht erforderlich ist. Aber das ist das Einzige, was ich zum Laufen bringen konnte.

Natürlicher Dank geht an @MagTun und @rokdd für die Entwicklung dieser Lösung.

Antwort3

Sie müssen diese Dienste nicht stoppen/starten, um das Bluetooth-Traybar-Symbol zu entfernen.

Die Anzeige des Symbols wird im Registrierungsschlüssel HKEY_CURRENT_USER\Control Panel\Bluetoothdurch den DWORD-Wert gesteuert, Notification Area Icondessen Werte 0für Aus und 1für Ein stehen. Damit dies wirksam wird, muss der Explorer neu gestartet werden.

Die folgenden beiden .batDateien erledigen diese Aufgabe.

Deaktivieren des Bluetooth-Benachrichtigungsbereichssymbols

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

Aktivieren Sie das Bluetooth-Benachrichtigungsbereichssymbol

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

verwandte Informationen