Такая простая задача, можно сказать, и я не нашел удовлетворительного решения. Что я пробовал (с музыкой, воспроизводимой через Bluetooth-подключенный динамик, чтобы действительно знать состояние радио):
- используя devcon в качестве администратора:
devcon disable USB\VID_8087&PID_07DC&REV_0001
(это HW ID моего адаптера Bluetooth) ... требуется перезагрузка для работы ... - используя powershell в качестве администратора:
Disable-NetAdapter "Bluetooth Network Connection 3"
(это перевод названия моего адаптера Bluetooth) ... он отключает драйвер PAN, но динамик Bluetooth продолжает воспроизводить музыку ... - используя net как admin:
net stop bthserv
... на самом деле радио не выключается (динамик BT продолжает воспроизводить музыку) - Использование .NET: на самой релевантной странице MSDN не сказано ни слова о включении / выключении адаптера.
- используя проводник:
ms-settings:bluetooth
илиexplorer.exe %LocalAppData%\Packages\windows.immersivecontrolpanel_cw5n1h2txyewy\LocalState\Indexed\Settings\cs-CZ\AAA_SettingsPagePCSystemBluetooth.settingcontent-ms
... открывает панель настроек Bluetooth, но мне все равно нужно нажать на переключатель
Я не могу поверить, что Microsoft так невежественна, чтобы не предоставлять такую команду ...
windows
windows-10
command-line
bluetooth
Мартин Пека
источник
источник
Ответы:
Это сложно из-за необходимости взаимодействия с WinRT, но это возможно в чистом PowerShell:
Чтобы использовать его, сохраните его в файл PS1, например
bluetooth.ps1
. Если вы этого еще не сделали, следуйте инструкциям в разделе «Включение сценариев» вики-тега PowerShell, чтобы включить выполнение сценариев в вашей системе. Затем вы можете запустить его из командной строки PowerShell следующим образом:Чтобы выключить Bluetooth, пройдите
Off
вместо.Чтобы запустить его из командного файла:
Предостережение: если служба поддержки Bluetooth не запущена, скрипт пытается запустить ее, потому что в противном случае WinRT не увидит радио Bluetooth. Увы, сервис не может быть запущен, если скрипт не работает от имени администратора. Чтобы сделать это ненужным, вы можете изменить тип запуска этой службы на автоматический.
Теперь для некоторого объяснения. Первые три строки устанавливают параметры, которые принимает скрипт. Прежде чем начать всерьез, мы должны убедиться, что служба поддержки Bluetooth работает, и запустить ее, если нет. Затем мы загружаем
System.Runtime.WindowsRuntime
сборку, чтобы можно было использоватьWindowsRuntimeSystemExtensions.AsTask
метод для преобразования задач в стиле WinRT (которые .NET / PowerShell не понимает) в .NETTask
. Этот конкретный метод имеет множество различных наборов параметров, которые, кажется, приводят к снижению разрешения перегрузки PowerShell, поэтому в следующей строке мы получим конкретный метод, который выполняет только результативную задачу WinRT. Затем мы определяем функцию, которую будем использовать несколько раз, чтобы извлечь результат соответствующего типа из асинхронной задачи WinRT. После объявления этой функции мы загружаем два необходимых типа из метаданных WinRT, Остальная часть сценария в значительной степени является просто переводом PowerShell кода C #, который вы написали в своем ответе; он используетRadio
класс WinRT для поиска и настройки радиомодуля Bluetooth.источник
$bluetooth
нулевой, что приведет к появлению этой ошибки со второй по последнюю строку.$radios
? Это покажет список радиостанций, которые возвратил WinRT.rfkill unblock bluetooth
Linux :-DОтказавшись от поиска готовых решений, я обнаружил, что приложения универсальной платформы Windows имеют доступ к API-интерфейсу радиоуправления .
Поэтому я объединил пример приложения для управления радио с приложением, управляемым из командной строки, и результат здесь: https://github.com/peci1/RadioControl . Он опубликован в Магазине Windows .
В общем случае невозможно просто запустить приложение в фоновом режиме, поэтому сначала необходимо запустить графический интерфейс, а затем вызвать его из командной строки, например
Основные функции, которые нужны этому приложению:
Затем вам также нужно добавить возможность Radios в манифест приложения:
И чтобы разрешить управление из командной строки, вам нужно переопределить метод
protected override async void OnActivated(IActivatedEventArgs args)
в App.xaml.cs и выполнить обработку в ветке следующим образом:источник
Disable/Enable-NetAdapter
? superuser.com/questions/1444278/…Этот скрипт Autohotkey, кажется, делает свое дело. Меня это беспокоит,
Sleep
но кажется, что окно становится активным, прежде чем оно будет готово для получения моих нажатий клавиш.Перейдите на /programming//q/48700268/308851, чтобы выяснить, чем это
Sleep 300
можно заменить.источник
Вот частичное решение:
wmic path Win32_PNPEntity where "caption like '%bluetooth%' AND DeviceID like 'USB\\%'" call disable
безусловно, исчезает выключатель Bluetooth On / Off, и диспетчер устройств сообщаетThis device is disabled. (Code 22)
. Достаточно ли этого, чтобы убить радио, я не уверен.Я не могу найти документацию о том, какие аргументы
call
принимает. Я думаю, что здесь должно быть что-то вродеrfkill
.источник
enable
не возобновляет воспроизведение Bluetooth. Документация по классу PNPEntity находится здесь: msdn.microsoft.com/en-us/library/aa394353(v=vs.85).aspx , но никаких других полезных методов там нет ...Вы можете использовать DevManView для включения / выключения устройства из командной строки, используя следующий синтаксис:
Это также позволяет использовать подстановочные знаки с
/use_wildcard
аргументом.источник
В Powershell есть командлеты для выполнения именно того, что вы ищете:
https://gallery.technet.microsoft.com/PowerShell-Device-60d73bb0
Используйте Get-Device, чтобы получить список устройств. Вы можете передать это через where-object, чтобы выбрать ваше устройство, а затем передать это Disable-Device или Enable-Device.
Подробные инструкции ...
Загрузите и разархивируйте файл.
Запустите PowerShell как администратор.
Измените политику выполнения при необходимости:
Импортируйте модуль:
Если вам нужно сузить список устройств, вы можете использовать сравнение:
Если вы знаете точное имя, вы можете использовать -eq (равно) сравнить:
Протрите руки на штаны.
источник
wmic
может сделать это тоже, по крайней мере, я так думаю.Disable-Device : Error calling SetupDiCallClassInstaller
. Я запускаю их как администратор и с неограниченной политикой исполнения.Я сделал пакетный скрипт, который проверяет значение ключа reg, которое будет доступно только в том случае, если ваше радио Bluetooth было включено. Затем он вызывает приведенный выше скрипт powershell от Ben N с правильным параметром для переключения его текущего состояния. Превращает его в ярлык переключения, вместо того, чтобы использовать его отдельно или выключать.
источник
Выполнение следующей команды из командной строки (как администратор) сделало свое дело:
Ранее я использовал ту же команду для отключения моего адаптера Wi-Fi и обнаружил, что она также работает с другими адаптерами в: Панель управления> Сеть и Интернет> Сетевые подключения. Просто измените аргумент «name» на имя вашего адаптера. Вы также можете включить его снова, изменив последний аргумент на
admin=enabled
.источник