2017-02-05 2 views
1

次のコード2を使用して、vlcやWindows Media Playerなどの外部プレーヤーをミュートします。WindowsのメディアプレーヤーをプロセスIDでミュートできない

Controlling Application's Volume: By Process-ID

VLCプレーヤーが適切にミュートされます。しかし、Windowsのメディアプレーヤーはありません。

視覚的には、次の図のように視覚的に正しく変異しています。しかし、私はまだスピーカーから音が聞こえます。私はミュート(アプリケーションのミュート)を削除し、それをマウスで手動で入力すると、正しくミュートされます。

enter image description here

enter image description here

 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); 


      } 


     } 
+0

関連性はないかもしれませんが、以前はWMP用のツールを書いていましたが、ボリュームレベルを制御するのと同様の問題がありました。 WMPは常に複数のオーディオセッションを持っていたことが判明したので、これらのセッションのそれぞれにボリュームを設定する必要がありました。 WMPプロセスIDを持つすべてのセッションがミュートされるように、 'VolumeMixer'クラスの実装を変更する必要があります。 – Streamline

+0

次のテストを実行しました。実行中のプロセス "Process.GetProcesses()"をすべて取得し、すべてのプロセスのボリュームをミュートしました。同じ問題が発生します。バーは下がっていますが、私はまだ聞いています。 – user2983041

+0

それはまさに私が意味していたものではありません。 GetVolumeObject(int pid)メソッドでは、セッションボリュームコントロールを1つだけ返す代わりに、WMPのプロセスIDを持つすべてのISimpleAudioVolumeを含むリストを返し、それらのすべてに対してミュート状態を設定する必要があります。 – Streamline

答えて

0

@Streamlineコメントで述べている:代わりつのみ セッションのボリュームコントロールを返す、1月:GetVolumeObject(INT PID)方法で

をWMPのプロセスIDを持つ ISimpleAudioVolumeをすべて含むリストを返し、を設定する必要がありますすべてミュート状態です。

これが問題でした。今は完璧に動作します。

関連する問題