2017-02-05 3 views
1

J'utilise le code de réponse 2 suivant pour désactiver les lecteurs externes tels que vlc ou windows media player.Impossible de mettre en sourdine le lecteur Windows Media par l'ID de processus

Controlling Application's Volume: By Process-ID

Le lecteur VLC est mis en sourdine correctement. Mais Windows Media Player ne le fait pas.

Visuellement, il est correctement muté comme le montre l'image suivante. Mais j'entends encore le son à travers les haut-parleurs. Lorsque je supprime la sourdine (sourdine de l'application) et que je la mets manuellement en utilisant la souris, elle est coupée correctement.

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

Cela peut ne pas être pertinent, mais j'ai déjà écrit un outil pour le WMP et j'ai eu des problèmes similaires avec le contrôle du niveau de volume. Il s'est avéré que le WMP avait toujours plus d'une session audio, donc j'ai dû régler le volume sur chacune de ces sessions. Vous devrez peut-être modifier l'implémentation de la classe 'VolumeMixer' de sorte que chaque session avec l'ID de processus WMP soit muette. – Streamline

+0

J'ai effectué le test suivant: J'ai obtenu tous les processus en cours d'exécution "Process.GetProcesses()" et j'ai coupé le volume de tous les processus. Le même problème se produit. Le bar est abaissé mais j'écoute toujours. – user2983041

+0

Ce n'est pas exactement ce que je voulais dire. Dans la méthode 'GetVolumeObject (int pid)': au lieu de renvoyer uniquement un contrôle de volume de session, il peut être nécessaire de renvoyer une liste contenant tous les ISimpleAudioVolume qui ont l'ID de processus du WMP et de définir l'état muet sur chacun d'eux. – Streamline

Répondre

0

@Streamline dit dans un commentaire:

Dans la méthode GetVolumeObject (int pid): au lieu de retourner un seul contrôle du volume de la session , on peut devez renvoyer une liste contenant tous les ISimpleAudioVolume qui ont l'ID de processus du WMP et définir le état muet sur chacun d'eux.

C'était le problème. Maintenant, cela fonctionne parfaitement.