1
次のコード2を使用して、vlcやWindows Media Playerなどの外部プレーヤーをミュートします。WindowsのメディアプレーヤーをプロセスIDでミュートできない
Controlling Application's Volume: By Process-ID
VLCプレーヤーが適切にミュートされます。しかし、Windowsのメディアプレーヤーはありません。
視覚的には、次の図のように視覚的に正しく変異しています。しかし、私はまだスピーカーから音が聞こえます。私はミュート(アプリケーションのミュート)を削除し、それをマウスで手動で入力すると、正しくミュートされます。
public static void mute()
{
for(int i = 0;i<playerList.Length;i++)
{
var hWnd = FindWindow(null, playerList[i]);
if (hWnd == IntPtr.Zero)
{
Console.WriteLine("Mute " + playerList[i] + " Error_1");
continue;
}
uint pID;
GetWindowThreadProcessId(hWnd, out pID);
if (pID == 0)
{
Console.WriteLine("Mute " + playerList[i] + " Error_2");
continue;
}
VolumeMixer.SetApplicationMute((int)pID, true);
Console.WriteLine("Mute " + playerList[i] + " Ok PID: " + pID);
}
}
関連性はないかもしれませんが、以前はWMP用のツールを書いていましたが、ボリュームレベルを制御するのと同様の問題がありました。 WMPは常に複数のオーディオセッションを持っていたことが判明したので、これらのセッションのそれぞれにボリュームを設定する必要がありました。 WMPプロセスIDを持つすべてのセッションがミュートされるように、 'VolumeMixer'クラスの実装を変更する必要があります。 – Streamline
次のテストを実行しました。実行中のプロセス "Process.GetProcesses()"をすべて取得し、すべてのプロセスのボリュームをミュートしました。同じ問題が発生します。バーは下がっていますが、私はまだ聞いています。 – user2983041
それはまさに私が意味していたものではありません。 GetVolumeObject(int pid)メソッドでは、セッションボリュームコントロールを1つだけ返す代わりに、WMPのプロセスIDを持つすべてのISimpleAudioVolumeを含むリストを返し、それらのすべてに対してミュート状態を設定する必要があります。 – Streamline