วิธีรีเซ็ตต่อการตั้งค่าระดับเสียงของแอปพลิเคชันใน Windows 7 และ Vista


18

ฉันเปลี่ยนแปลงการตั้งค่าระดับเสียงของแอปพลิเคชันสำหรับแอปพลิเคชันของฉัน ฉันต้องการรีเซ็ตการตั้งค่าระดับเสียงทุกครั้งเพื่อให้แอปทั้งหมดใช้การตั้งค่าระดับเสียงโลก ฉันควรทำอย่างไร


คำตอบ:


11

ฉันพบวิธีแก้ปัญหาที่ใช้งานได้ แต่มันค่อนข้างแฮ็ค ฉันชอบทางออกที่ดีกว่า แต่ในระหว่างนี้ลอง:

ตั้งค่าระดับเสียงโลกเป็นสูงสุดย้ายแต่ละระดับเสียงของแอปพลิเคชันแต่ละค่าสูงสุด จากนั้นเลื่อนระดับเสียงของโลกลง ดูเหมือนว่าจะใช้งานได้ การตั้งค่าระดับเสียงของแอปพลิเคชันทั้งหมดจะเชื่อมโยงกับการตั้งค่าส่วนกลาง


ใช้งานไม่ได้สำหรับฉัน ไคลเอ็นต์ Last.fm เปลี่ยนกลับเป็น ~ 15% ของจำนวนสูงสุดเสมอ
Robert

4

ฉันต้องทำสิ่งนี้ให้สูงสุด -> รีเซ็ตตลอดเวลา ในที่สุดฉันก็ค้นหาเน็ตเพื่อดูว่ามีฮอตคีย์ลับหรือคำสั่งผสมที่ฉันหายไปหรือไม่ ชัดเจนว่าไม่. : /

ดังนั้นฉันจึงสร้างสคริปต์autoitเพื่อทำสิ่งนี้เร็วกว่าที่เป็นไปได้อย่างมนุษย์ปุถุชน :) ฉันรวบรวมมันผ่าน tools-> build และวิธีที่ฉันสามารถเรียกใช้ exe โดยค้นหาในเมนูเริ่ม

มันทำให้ตัวเลื่อนทั้งหมดเลิกเปิดเสียงและไปที่ 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);

ขอบคุณเธรด autoit นี้สำหรับข้อมูลเกี่ยวกับการเลื่อนตัวควบคุมแถบเลื่อน



3

.batไฟล์ต่อไปนี้จากPer4u3eบนฟอรัม Microsoftทำเคล็ดลับสำหรับฉัน ทำงานโดยหยุดบริการเสียงชั่วคราวและแก้ไขรีจิสทรีเพื่อรีเซ็ต Windows ให้เป็นการตั้งค่าเสียงเริ่มต้น

โปรดทราบว่าอย่างน้อยใน Windows 10 คุณอาจต้องเรียกใช้สคริปต์ในฐานะผู้ดูแลระบบ

@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

2

บิตของ Powershell เขียนคำตอบที่แบ่งปันโดยสตีเวนข้างบนฉันยืมบิตจากรหัสการยกระดับตนเองที่ดีที่นี่: https://blogs.msdn.microsoft.com/virtual_pc_guy/2010/09/23/a-self-elevating -powershell สคริปต์ /

ทำไม? มันทำงานเร็วกว่าสคริปต์ชุดและฉันใช้มากนี้ คิดว่าฉันจะแบ่งปัน :)

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

หรือหากคุณต้องการโดยไม่มีข้อความแสดงความคิดเห็นหยาบหรือยกระดับตนเอง:

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

1

ฉันใช้สคริปต์ของ ferrix มาระยะหนึ่งแล้ว แต่ฉันปรับเปลี่ยนเพื่อตั้งค่าตัวเลื่อนระดับแอปพลิเคชันทั้งหมดให้ตรงกับระดับเสียงหลักปัจจุบันแทนที่จะตั้งค่าทั้งหมดเป็น 50% ฉันยังแก้ไขมันเพื่อให้ทำงานกับตัวเลื่อนโดยตั้งค่าปริมาณน้อยกว่า 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")

เครดิตไปที่ ferrix สำหรับการเขียนสคริปต์ต้นฉบับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.