Изменить звуковую схему в окнах через реестр

Как изменить звуковую схему на "нет звука" для существующего пользователя, отредактировав реестр? Я делаю.reg файл со всеми твиками, которые мне нужны на недавно установленных окнах, но я застрял с изменением звуковой схемы.

2 ответа

Изменить схему относительно легко. Однако затем вы должны применить новую схему, которая немного сложнее.

Схема "Без звука" имеет название .None; Вы можете увидеть это, исследуя HKEY_CURRENT_USER\AppEvents\Schemes\Names,

Выбранная схема находится на HKEY_CURRENT_USER\AppEvents\Schemes, который по умолчанию .Default, Таким образом, вы можете установить выбранную схему, изменив это на .None:

New-ItemProperty -Path HKCU:\AppEvents\Schemes -Name "(Default)" -Value ".None" -Force | Out-Null

Это (технически) установит выбранную схему, которую вы можете проверить, зайдя в настройки звука и увидев, что No Sounds схема выбрана. Однако звуки событий все равно будут воспроизводиться, и это потому, что выбранная схема не была применена.

Чтобы применить звуковую схему, соответствующее действие:

  • Для каждого совпадения события приложения HKEY_CURRENT_USER\AppEvents\Schemes\Apps\*\*скопируйте подраздел для нового имени схемы над подразделом с именем .Current,

Например, чтобы применить схему "Нет звуков" к событию System Exclamation, вы должны скопировать HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\SystemExclamation\.None над HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\SystemExclamation\.Current,

Однако в вашем случае вы можете просто очистить все значения, так как вы применяете тему "без звуков". Это может быть достигнуто одной строкой:

Get-ChildItem -Path "HKCU:\AppEvents\Schemes\Apps" | Get-ChildItem | Get-ChildItem | Where-Object {$_.PSChildName -eq ".Current"} | Set-ItemProperty -Name "(Default)" -Value ""

Шаг за шагом:

  • Get-ChildItem -Path "HKCU:\AppEvents\Schemes\Apps" получает все приложения.
  • Get-ChildItem получает все события приложения.
  • Get-ChildItem получает все настройки звука событий приложения для каждой схемы.
  • Where-Object {$_.PSChildName -eq ".Current"} выбирает все настройки звука событий приложения, которые применяются в данный момент.
  • Set-ItemProperty -Name "(Default)" -Value "" очищает эти настройки звука.

Для более подробной информации:

Похоже, что ключи под HKEY_CURRENT_USER\AppEvents\Schemes\Apps приложения, их значением по умолчанию является строка отображения. Те, что в моей системе .Default ("Windows"), Explorer ("Проводник") и sapisvr ("Распознавание речи").

Ключи под каждым ключом приложения являются событиями приложения для этого приложения.

Клавиши под каждой клавишей события приложения - это звуки, воспроизводимые для каждой звуковой схемы. Так HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\SystemExclamation\.None это звук для воспроизведения восклицания системы Windows при использовании схемы "Нет звуков", и HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\SystemExclamation\.Default звук для воспроизведения восклицания системы Windows при использовании схемы Windows по умолчанию.

Кроме того, есть .Current ключ на этом уровне, который является реальным звуком, который воспроизводится. Предположительно, когда вы выбираете новую схему в пользовательском интерфейсе, он копирует каждую настройку отдельно .Current значение.

Я только что создал этот скрипт. Используйте на свой риск;

if (-Not (Test-Path 'HKCU:\AppEvents\Schemes\Names\.None'))
{ 
    New-Item -Path 'HKCU:\AppEvents\Schemes\Names' -Name '.None'
    New-ItemProperty -Path 'HKCU:\AppEvents\Schemes\Names\.None' -Name '(Default)' -Type 'String' -Value 'No Sounds'
}

Get-ChildItem -Path 'HKCU:\AppEvents\Schemes\Apps\.Default' | Select Name | ForEach-Object {
    $thing = $_.Name -replace "HKEY_CURRENT_USER", "HKCU:"
    $fullnun = "$thing\.None"
    if (-Not (Test-Path $thing))
    {
        New-Item -Path $thing -Name '.None'
        echo "$thing\.None created"
    } else {
        echo "$thing\.None already existed"
    }

    if (Test-Path($fullnun))
    {
        New-ItemProperty -Path $fullnun -Name '(Default)' -Type 'String' -Value ''
    }
}

Set-ItemProperty -Path 'hkcu:\AppEvents\Schemes' -Name "(Default)" -Type "String" -Value ".None"

Вот мой код для установки звуковых схем на "NO SOUND"

Write-Host " Setting Sound Schemes to 'No Sound' .." -foregroundcolor Gray -backgroundcolor black

$Path = "HKCU:\AppEvents\Schemes"

$Keyname = "(Default)"

$SetValue = ".None"

$TestPath = Test-Path $Path
if (-Not($TestPath -eq $True)) {
   Write-Host " Creating Folder.. " -foregroundcolor Gray -backgroundcolor black
   New-item $path -force
}

if (Get-ItemProperty -path $Path -name $KeyName -EA SilentlyContinue) {

   $Keyvalue = (Get-ItemProperty -path $Path).$keyname

   if ($KeyValue -eq $setValue) {

       Write-Host " The Registry Key Already Exists. " -foregroundcolor green -backgroundcolor black


   }
   else {

       Write-Host " Changing Key Value.. " -foregroundcolor Gray -backgroundcolor black

       New-itemProperty -path $Path -Name $keyname -value $SetValue -force # Set 'No Sound' Schemes
       Get-ChildItem -Path "HKCU:\AppEvents\Schemes\Apps" | # Apply 'No Sound' Schemes
        Get-ChildItem |
        Get-ChildItem |
        Where-Object { $_.PSChildName -eq ".Current" } |
        Set-ItemProperty -Name "(Default)" -Value ""

       Write-Host " The Registry Key Value Changed Sucessfully. " -foregroundcolor green -backgroundcolor black
   }

}
else {

   Write-Host " Creating Registry Key.. " -foregroundcolor Gray -backgroundcolor black

   New-itemProperty -path $Path -Name $keyname -value $SetValue -force
   Get-ChildItem -Path "HKCU:\AppEvents\Schemes\Apps" |
       Get-ChildItem |
       Get-ChildItem |
       Where-Object { $_.PSChildName -eq ".Current" } |
       Set-ItemProperty -Name "(Default)" -Value ""


   Write-Host " The Registry Key Created Sucessfully. " -foregroundcolor green -backgroundcolor black
}
Другие вопросы по тегам