programing

파워셸에서 오디오 레벨을 변경하시겠습니까?

testmans 2023. 9. 17. 12:11
반응형

파워셸에서 오디오 레벨을 변경하시겠습니까?

파워셸을 사용하여 스피커 볼륨을 설정하려면 어떻게 해야 합니까?나는 온라인에서 여기와 다른 곳을 뒤졌지만 정말로 답을 찾을 수 없습니다.

Win32 API를 랩핑한 다음 내 파워셸 스크립트에서 호출하는 무언가를 C#에 써야 할 것 같습니다.Win32 API는 다음 중 하나일 것입니다.

[DllImport("winmm.dll")]
public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume);

[DllImport("winmm.dll")]
public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);

Windows 10에서 SendKeys가 작동을 멈췄습니다(문자 그대로 내 캐럿이 있는 곳에 숫자를 입력합니다).저는 이 블로그 게시물을 매우 편리한 방법으로 찾았습니다.

먼저 오디오 API에 액세스하려면 다음을 실행합니다.

Add-Type -TypeDefinition @'
using System.Runtime.InteropServices;
[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IAudioEndpointVolume
{
    // f(), g(), ... are unused COM method slots. Define these if you care
    int f(); int g(); int h(); int i();
    int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext);
    int j();
    int GetMasterVolumeLevelScalar(out float pfLevel);
    int k(); int l(); int m(); int n();
    int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext);
    int GetMute(out bool pbMute);
}
[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDevice
{
    int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev);
}
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDeviceEnumerator
{
    int f(); // Unused
    int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint);
}
[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { }
public class Audio
{
    static IAudioEndpointVolume Vol()
    {
        var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
        IMMDevice dev = null;
        Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev));
        IAudioEndpointVolume epv = null;
        var epvid = typeof(IAudioEndpointVolume).GUID;
        Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv));
        return epv;
    }
    public static float Volume
    {
        get { float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v; }
        set { Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty)); }
    }
    public static bool Mute
    {
        get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; }
        set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); }
    }
}
'@

그런 다음 이렇게 볼륨을 조절합니다.

[audio]::Volume  = 0.2 # 0.2 = 20%, etc.

그리고 이렇게 음소거/음소거를 하지 않습니다.

[audio]::Mute = $true  # Set to $false to un-mute

이러한 명령을 사용하여 음소거, 볼륨 하향, 볼륨 상향 스피커 레벨을 설정할 수 있습니다.단순한1..50루프(각 카운터 = 2% 볼륨)를 추가하여 C#의 필요 없이 입력을 받아 볼륨을 조정하는 기능을 만들 수 있습니다.

볼륨 음소거

$obj = new-object -com wscript.shell
$obj.SendKeys([char]173)

볼륨 하향 버튼

$obj = new-object -com wscript.shell
$obj.SendKeys([char]174)

볼륨 업 버튼

$obj = new-object -com wscript.shell
$obj.SendKeys([char]175)

여기서 관련 정보를 찾으십시오.

PowerShell에서 소리를 음소거/ 음소거하려면 어떻게 해야 합니까?

http://blogs.technet.com/b/heyscriptingguy/archive/2013/07/28/weekend-scripter-cheesy-script-to-set-speaker-volume.aspx

편집: 여기 재사용 가능한 기능이 있습니다. 파워셸 v2에서 W7x64 w를 테스트하고 작동합니다.

Function Set-Speaker($Volume){$wshShell = new-object -com wscript.shell;1..50 | % {$wshShell.SendKeys([char]174)};1..$Volume | % {$wshShell.SendKeys([char]175)}}
#

사용 예시.각 눈금은 2%임을 기억하십시오.

#Sets volume to 60%
Set-Speaker -Volume 30

#Sets volume to 80%
Set-Speaker -Volume 40

#Sets volume to 100%
Set-Speaker -Volume 50

그리고 이 기능은 Toggle-Mute를 합니다.

Function Toggle-Mute(){$wshShell = new-object -com wscript.shell;$wshShell.SendKeys([char]173)}
#

오디오 기기를 조작하기 위한 cmdlet을 만들었습니다.

http://www.automatedops.com/projects/windowsaudiodevice-powershell-cmdlet/

라이브 피크 값 디스플레이도 포함되어 있습니다.

enter image description here

@Knuckle-Dragger의 솔루션이 마음에 들었지만 몇 가지 사항을 변경했습니다.제 솔루션은 파워셸 스크립트(.ps1 파일)와 batch/.cmd 파일로 구성되어 있습니다.이 작업은 바로 가기를 만들고 시작 폴더에 배치할 수 있도록 좀 더 쉽게 사용할 수 있도록 하기 위해 수행됩니다.

아마도 .ps1 파일을 직접 실행할 수 있는 바로 가기를 만드는 방법이 있을 것입니다(그리고 아마도 있다는 것을 인정합니다) 그러면 .cmd 파일이 생략될 수 있습니다.다음에 작업할 수도 있습니다.

스크립트 코드도 몇 가지 개선했습니다.제 조정을 통해 번호를 제공할 수 있으며, 볼륨은 해당 번호로 설정됩니다(해당 번호의 2배가 아님).사용하는 키 누름은 2%씩 증가하기 때문에 홀수로 설정할 수는 없지만 요청된 볼륨 수준에 최대한 가까워집니다.

set vol.ps1 파일 내용입니다.

<# begin function #>
Function Set-Speaker($Volume){$wshShell = new-object -com wscript.shell;1..50 | % {$wshShell.SendKeys([char]174)};1..$Volume | % {$wshShell.SendKeys([char]175)}}
<# end function #>

write-host "Requested volume:" $args[0]

<# set the volume here #>
$vol=$args[0] / 2
Set-Speaker -volume $vol 

<# show the operator how the volume ws actually set... it may be off by 1 from their request #>
$vol=$vol * 2
write-host "Volume adjusted to" $vol

할 수 를 들어 에서 을 과 할 하면 할 .powershell <path>\setvol.ps1 50볼륨을 50%로 설정하려면 다음 한 줄로 .cmd 파일을 만들기로 했습니다.

powershell <path>\setvol.ps1 %1

이를 통해 .cmd 파일에 대한 Windows 바로 가기를 구성하고 원하는 볼륨 수준에 대한 매개 변수를 제공할 수 있습니다.그러면 로그인할 때 실행되도록 바로 가기를 시작 폴더에 넣을 수 있습니다.

TechNet에서 이 PC 볼륨 컨트롤 스크립트를 확인합니다.이것은 최소한 윈도우 XP에서는 당신이 요구하는 것을 할 수 있다고 주장합니다.여기에 NirCmd라는 도구를 사용하는 또 다른 접근법이 있습니다.

언급URL : https://stackoverflow.com/questions/21355891/change-audio-level-from-powershell

반응형