ฉันเปลี่ยนแปลงการตั้งค่าระดับเสียงของแอปพลิเคชันสำหรับแอปพลิเคชันของฉัน ฉันต้องการรีเซ็ตการตั้งค่าระดับเสียงทุกครั้งเพื่อให้แอปทั้งหมดใช้การตั้งค่าระดับเสียงโลก ฉันควรทำอย่างไร
ฉันเปลี่ยนแปลงการตั้งค่าระดับเสียงของแอปพลิเคชันสำหรับแอปพลิเคชันของฉัน ฉันต้องการรีเซ็ตการตั้งค่าระดับเสียงทุกครั้งเพื่อให้แอปทั้งหมดใช้การตั้งค่าระดับเสียงโลก ฉันควรทำอย่างไร
คำตอบ:
ฉันพบวิธีแก้ปัญหาที่ใช้งานได้ แต่มันค่อนข้างแฮ็ค ฉันชอบทางออกที่ดีกว่า แต่ในระหว่างนี้ลอง:
ตั้งค่าระดับเสียงโลกเป็นสูงสุดย้ายแต่ละระดับเสียงของแอปพลิเคชันแต่ละค่าสูงสุด จากนั้นเลื่อนระดับเสียงของโลกลง ดูเหมือนว่าจะใช้งานได้ การตั้งค่าระดับเสียงของแอปพลิเคชันทั้งหมดจะเชื่อมโยงกับการตั้งค่าส่วนกลาง
ฉันต้องทำสิ่งนี้ให้สูงสุด -> รีเซ็ตตลอดเวลา ในที่สุดฉันก็ค้นหาเน็ตเพื่อดูว่ามีฮอตคีย์ลับหรือคำสั่งผสมที่ฉันหายไปหรือไม่ ชัดเจนว่าไม่. : /
ดังนั้นฉันจึงสร้างสคริปต์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 นี้สำหรับข้อมูลเกี่ยวกับการเลื่อนตัวควบคุมแถบเลื่อน
.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
บิตของ 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
ฉันใช้สคริปต์ของ 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 สำหรับการเขียนสคริปต์ต้นฉบับ