Como redefinir a configuração de volume por aplicativo no Windows 7 e Vista

Respostas:

11

Eu encontrei uma solução alternativa que funciona, mas é um pouco imprudente. Prefiro uma solução melhor, mas, enquanto isso, tente:

Defina o volume global para o máximo, mova cada volume de aplicativo individual para o máximo também. Em seguida, mova o volume global para baixo. Parece estar funcionando. Todas as configurações de volume do aplicativo agora estão vinculadas à configuração global.

Mehrdad Afshari
fonte
Nao funciona para mim. O cliente Last.fm sempre volta para ~ 15% do máximo.
Robert
4

Eu tenho que fazer isso tudo max -> redefinir o tempo todo. Eu finalmente procurei na net para ver se havia alguma tecla de atalho ou combinação secreta que estava faltando. Aparentemente não. : /

Então eu criei um script de autoit para fazer isso mais rapidamente do que humanamente possível :) Eu o compilei através de tools-> build e dessa forma eu posso executar o exe pesquisando no menu Iniciar.

Faz com que todos os controles deslizantes sejam desativados e atinjam 50%.

Volume_Normalize.au3:

#include <GuiConstantsEx.au3>
#include <GuiSlider.au3>

Func SlideTo($Win, $Ctrl, $Pct)

    If Not IsInt($Pct) Or $Pct < 3 Or $Pct > 100 Then
        SetError(1)
        Return False
    EndIf

   $CtrlHandle = ControlGetHandle($Win, '', $Ctrl)
   if not $CtrlHandle Then
      SetError(2)
      Return False
   EndIf

    Local $SetValue, $SendValue
    If $Pct <= 51 Then
        $SetValue = $Pct + 1
        $SendValue = '{UP}'
    Else
        $SetValue = $Pct - 1
        $SendValue = '{DOWN}'
    EndIf
    _GUICtrlSlider_SetPos($CtrlHandle, $SetValue)
    Local $PrevOpt = Opt('SendKeyDelay', 1)
    ControlSend($Win, '', $Ctrl, $SendValue)
    Opt('SendKeyDelay', $PrevOpt)

    Return True
EndFunc

Func EachSliderTo($Win, $Pct)

   WinWait($Win, "")
   If Not WinActive($Win,"") Then WinActivate($Win,"")
   local $i = 1
   If not WinActive($Win,"") Then WinActivate($Win,"")
   While True
      $Ctrl = "[CLASS:msctls_trackbar32; INSTANCE:"& $i &"]"
      if not SlideTo($Win, $Ctrl, $Pct) Then
         ExitLoop
      EndIf
      $i = $i + 1
   WEnd
   Return True
EndFunc

$Win = "Volume Mixer"
$Prog = "SndVol.exe"
if Not WinActive($Win,"") Then
   if not WinActivate($Win,"") Then
      ShellExecute($Prog)
      If not WinActive($Win,"") Then WinActivate($Win,"")
   EndIf
EndIf
WinWait($Win)
EachSliderTo("Volume Mixer",100);
EachSliderTo("Volume Mixer", 50);

Graças a este tópico de autoit para obter informações sobre como mover controles deslizantes.

ferrix
fonte
Na minha área de trabalho do Windows 10, eu não acho que este script está funcionando como deveria ...
Stevoisiak
3

O seguinte .batarquivo do Per4u3e nos Fóruns da Microsoft fez o truque para mim. Ele funciona interrompendo temporariamente os serviços de áudio e modificando o registro para redefinir o Windows para as configurações de áudio padrão.

Observe que, pelo menos no Windows 10, pode ser necessário executar o script como administrador.

@ECHO OFF

ECHO Reset Volume Mixer Settings...

NET STOP Audiosrv
NET STOP AudioEndpointBuilder

REG DELETE "HKCU\Software\Microsoft\Internet Explorer\LowRegistry\Audio\PolicyConfig\PropertyStore" /F
REG ADD "HKCU\Software\Microsoft\Internet Explorer\LowRegistry\Audio\PolicyConfig\PropertyStore"

NET START Audiosrv
Stevoisiak
fonte
2

Reescrevendo um pouco a Powershell da resposta compartilhada por Steven acima, peguei emprestado um pouco do código bacana de auto-elevação aqui: https://blogs.msdn.microsoft.com/virtual_pc_guy/2010/09/23/a-self-elevating -powershell-script /

Por quê? Ele roda muito mais rápido que o script em lote e eu uso muito isso. Achei que eu iria compartilhar. :)

If(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) {
    $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell"
    $newProcess.Arguments = $myInvocation.MyCommand.Definition
    $newProcess.Verb = "runas"
    $null = [System.Diagnostics.Process]::Start($newProcess)
    Return
}

cls
$ErrorActionPreference = "SilentlyContinue"

Write-Host '--- Reset Windows Audio Mixer ---' -ForegroundColor Cyan;""

Write-Host 'Stopping Service [Audiosrv]             : ' -ForegroundColor White -NoNewline
$Error.Clear()
Stop-Service -Name Audiosrv -Force
If($Error) {Write-Host 'Error' -ForegroundColor Red} Else {Write-Host 'OK' -ForegroundColor Green}

Write-Host 'Stopping Service [AudioEndpointBuilder] : ' -ForegroundColor White -NoNewline
$Error.Clear()
Stop-Service -Name AudioEndpointBuilder -Force
If($Error) {Write-Host 'Error' -ForegroundColor Red} Else {Write-Host 'OK' -ForegroundColor Green}

Write-Host 'Deleting Registry Key [PropertyStore]   : ' -ForegroundColor White -NoNewline
$Error.Clear()
Remove-Item -Path 'HKCU:Software\Microsoft\Internet Explorer\LowRegistry\Audio\PolicyConfig\PropertyStore' -Force -Recurse
If($Error) {Write-Host 'Error' -ForegroundColor Red} Else {Write-Host 'OK' -ForegroundColor Green}

Write-Host 'Creating Registry Key [PropertyStore]   : ' -ForegroundColor White -NoNewline
$Error.Clear()
$null = New-Item -Path 'HKCU:Software\Microsoft\Internet Explorer\LowRegistry\Audio\PolicyConfig\' -Name PropertyStore
If($Error) {Write-Host 'Error' -ForegroundColor Red} Else {Write-Host 'OK' -ForegroundColor Green}

Write-Host 'Starting Service [Audiosrv]             : ' -ForegroundColor White -NoNewline
$Error.Clear()
Start-Service -Name Audiosrv
If($Error) {Write-Host 'Error' -ForegroundColor Red} Else {Write-Host 'OK' -ForegroundColor Green}

Sleep -Seconds 5

Ou, se preferir, sem o texto bruto de feedback ou a auto-elevação:

Stop-Service -Name Audiosrv -Force
Stop-Service -Name AudioEndpointBuilder -Force

Remove-Item -Path 'HKCU:Software\Microsoft\Internet Explorer\LowRegistry\Audio\PolicyConfig\PropertyStore' -Force -Recurse
$null = New-Item -Path 'HKCU:Software\Microsoft\Internet Explorer\LowRegistry\Audio\PolicyConfig\' -Name PropertyStore

Start-Service -Name Audiosrv

Pause
Alan McLaughlin Jr
fonte
1

Uso o script da ferrix há algum tempo, mas o modifiquei para definir todos os controles deslizantes de volume do aplicativo para corresponderem ao volume principal atual, em vez de configurá-los para 50%. Também a alterei para funcionar em controles deslizantes com volumes definidos abaixo de 3%.

Volume_Normalize_Alt.au3:

#include <GuiConstantsEx.au3>
#include <GuiSlider.au3>

Func SlideTo($Win, $Ctrl, $Pct)

    If Not IsInt($Pct) Or $Pct < 0 Or $Pct > 100 Then
        SetError(1)
        Return False
    EndIf

    $CtrlHandle = ControlGetHandle($Win, '', $Ctrl)
    If Not $CtrlHandle Then
        SetError(2)
        Return False
    EndIf

    Local $SetValue, $SendValue
    If $Pct <= 51 Then
        $SetValue = $Pct + 1
        $SendValue = '{UP}'
    Else
        $SetValue = $Pct - 1
        $SendValue = '{DOWN}'
    EndIf
    _GUICtrlSlider_SetPos($CtrlHandle, $SetValue)
    Local $PrevOpt = Opt('SendKeyDelay', 1)
    ControlSend($Win, '', $Ctrl, $SendValue)
    Opt('SendKeyDelay', $PrevOpt)

    Return True
EndFunc   ;==>SlideTo

Func EachSliderTo($Win, $Pct)

    WinWait($Win, "")
    If Not WinActive($Win, "") Then WinActivate($Win, "")
    Local $i = 1
    If Not WinActive($Win, "") Then WinActivate($Win, "")
    While True
        $Ctrl = "[CLASS:msctls_trackbar32; INSTANCE:" & $i & "]"
        If Not SlideTo($Win, $Ctrl, $Pct) Then
            ExitLoop
        EndIf
        $i = $i + 1
    WEnd
    Return True
EndFunc   ;==>EachSliderTo

$Win = "Volume Mixer"
$Prog = "SndVol.exe"
If Not WinActive($Win, "") Then
    If Not WinActivate($Win, "") Then
        ShellExecute($Prog)
        If Not WinActive($Win, "") Then WinActivate($Win, "")
    EndIf
EndIf
WinWait($Win)

;Master volume has the highest instance number so find slider with highest instance then return its handle.
Local $i = 1
While True
    Local $h = ControlGetHandle($Win, '', "[CLASS:msctls_trackbar32; INSTANCE:" & $i & "]")
    If @error > 0 Then
        ExitLoop
    EndIf
    $i = $i + 1
    Local $Handle = $h ;store last sucessful handle to be returned
WEnd

Local $CurrMasterVol = _GUICtrlSlider_GetPos($Handle)

;100 is 0% and 0 is 100%
;EachSliderTo("Volume Mixer", 100) ;What is the point of doing this first?
EachSliderTo("Volume Mixer", $CurrMasterVol)
WinClose("Volume Mixer")

O crédito é atribuído à ferrix por escrever o roteiro original.

CyberKiller
fonte