すでにミュートされていない限り、最初にサウンドをミュートし、最後にミュートを解除するPowerShellコマンドレットを作成しようとしています(最初からミュートされていない場合のみ)。使用できるPoweShellまたはWMIオブジェクトが見つかりませんでした。 auxGetVolume や auxSetVolume のようなWin32関数をいじっていましたが、うまく機能しませんでした(IntPtrから値を読み取る方法は?)。
V2CTP2を使用しています。アイデアはありますか?
ありがとう!
音量を調整するための迅速で簡単な方法はないようです。c++の経験がある場合は、 このブログ投稿 で何かを行うことができます。ここで、LarryOstermanがIAudioEndpointVolumeインターフェイスを呼び出す方法について説明しています。プラットフォームAPI(Vistaの場合、XPは、いくつかの検索で見つけたものよりも難しいかもしれません)。
V2ではインラインコードを(Add-Typeを介して)コンパイルできるので、それはオプションかもしれません。
Vista以降では、 Core Audio API を使用してシステムボリュームを制御する必要があります。これは自動化をサポートしないCOMAPIであるため、.NETおよびPowerShellから使用するには多くの定型文が必要です。
とにかく、以下のコードを使用すると、PowerShellから[Audio]::Volume
プロパティと[Audio]::Mute
プロパティにアクセスできます。これは、便利なリモートコンピュータでも機能します。 PowerShellウィンドウにコードをコピーして貼り付けるだけです。
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)); }
}
}
'@
使用例:
PS C:\> [Audio]::Volume # Check current volume (now about 10%)
0,09999999
PS C:\> [Audio]::Mute # See if speaker is muted
False
PS C:\> [Audio]::Mute = $true # Mute speaker
PS C:\> [Audio]::Volume = 0.75 # Set volume to 75%
PS C:\> [Audio]::Volume # Check that the changes are applied
0,75
PS C:\> [Audio]::Mute
True
PS C:\>
必要に応じて、Core Audio API用のより包括的な.NETラッパーがありますが、PowerShellに適したコマンドレットのセットを認識していません。
P.S。Diogo answer 賢いようですが、私にはうまくいきません。
Ps1PowerShellスクリプトで次のコマンドを使用します。
$obj = new-object -com wscript.Shell
$obj.SendKeys([char]173)
アレクサンドルの答えは私の状況に合っていますが、「var」の名前空間に関するコンパイルエラーのため、彼の例は機能しません。 .netの新しい/異なるバージョンでは、例が機能しない可能性があるようです。コンパイルエラーが発生した場合、これはそのような場合に試す代替バージョンです。
Add-Type -Language CsharpVersion3 -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)); }
}
}
'@
使用法は同じです:
PS C:\> [Audio]::Volume # Check current volume (now about 10%)
0,09999999
PS C:\> [Audio]::Mute # See if speaker is muted
False
PS C:\> [Audio]::Mute = $true # Mute speaker
PS C:\> [Audio]::Volume = 0.75 # Set volume to 75%
PS C:\> [Audio]::Volume # Check that the changes are applied
0,75
PS C:\> [Audio]::Mute
True
PS C:\>
Windowsオーディオサービスを管理するだけで、猫の皮を剥ぐことができます。ミュートするには停止し、ミュートを解除するには開始します。
Vbscriptの解決策:
Set WshShell = CreateObject("WScript.Shell")
For i = 0 To 50
WshShell.SendKeys(chr(174))
WScript.Sleep 100
Next
キーは毎回音量を2ずつ下げます。
PowerShellではないことはわかっていますが、MichaelとDiogoの回答を組み合わせると、1行のVBScriptソリューションが得られます。
CreateObject("WScript.Shell").SendKeys(chr(173))
これをmute.vbs
で叩くと、ダブルクリックしてミュートを切り替えることができます
Set-ExecutionPolicy
する必要はありませんPowerShellでこれを行う方法は見つかりませんでしたが、次のコマンドを実行することでトリックを実行するNirCmdというコマンドラインユーティリティがあります。
C:\ utils\nircmd.exe mutesysvolume 2
NirCmdはここから無料で入手できます: http://www.nirsoft.net/utils/nircmd.html
PowerShellからオーディオレベルを変更しますか? に対する私の答えを確認してください
Set-DefaultAudioDeviceMute