2017-02-05 2 views
1

Ich verwende den folgenden Code der Antwort 2, um externe Player wie VCL oder Windows Media Player stumm zu schalten.Windows Media Player kann nicht durch Prozess-ID stummgeschaltet werden

Controlling Application's Volume: By Process-ID

Der VLC-Player richtig ist stumm geschaltet. Aber Windows Media Player nicht.

Visuell ist es korrekt mutiert, wie in der folgenden Abbildung gezeigt. Aber ich höre immer noch den Ton über die Lautsprecher. Wenn ich die Stummschaltung (Stummschaltung der Anwendung) entferne und sie manuell mit der Maus einsetze, wird sie stummgeschaltet.

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

Es mag nicht relevant sein, aber ich schrieb einmal ein Werkzeug für den WMP und hatte ähnliche Probleme mit der Kontrolle der Lautstärke. Es stellte sich heraus, dass das WMP immer mehr als eine Audiositzung hatte, daher musste ich die Lautstärke für jede dieser Sitzungen einstellen. Möglicherweise müssen Sie die Implementierung der Klasse "VolumeMixer" so ändern, dass jede Sitzung mit der WMP-Prozess-ID stummgeschaltet wird. – Streamline

+0

Ich habe den folgenden Test durchgeführt: Ich habe alle laufenden Prozesse "Process.GetProcesses()" erhalten und ich habe die Lautstärke aller Prozesse stummgeschaltet. Das gleiche Problem passiert. Die Bar ist abgesenkt, aber ich höre immer noch zu. – user2983041

+0

Das ist nicht genau das, was ich meinte. In der 'GetVolumeObject (int pid)' Methode: Anstatt nur ein Session-Volume-Steuerelement zurückzugeben, muss man möglicherweise eine Liste mit allen 'ISimpleAudioVolume' zurückgeben, die die Prozess-ID des WMP haben und den Mute-Status für alle setzen. – Streamline

Antwort

0

sagte @Streamline in Kommentar:

Im GetVolumeObject (int pid) Methode: statt nur einer Sitzungs Lautstärke der Rücksendung, kann man müssen eine Liste mit allen ISimpleAudioVolume zurückgeben, die die Prozess-ID des WMP haben und diesetzenstummschalten auf alle von ihnen.

Das war das Problem. Jetzt funktioniert es perfekt.