2017-02-05 14 views
1

Я использую следующий код ответа 2 для отключения внешних игроков, таких как vlc или windows media player.Can not mute windows media player по id процесса

Controlling Application's Volume: By Process-ID

Игрок VLC правильно приглушен. Но Windows Media Player этого не делает.

Визуально он правильно мутирован, как показано на следующем изображении. Но я все еще слышу звук через динамики. Когда я удаляю приглушение звука (приглушение приложения), и я помещаю его вручную с помощью мыши, он отключается правильно.

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 всегда было больше одного сеанса аудио, поэтому мне пришлось установить громкость на каждом из этих сеансов. Возможно, вам придется изменить реализацию класса «VolumeMixer» таким образом, чтобы каждый сеанс с идентификатором процесса WMP был отключен. – Streamline

+0

Я выполнил следующий тест: я получил все запущенные процессы «Process.GetProcesses()», и я отключил звук всего процесса. То же самое происходит. Бар понижен, но я все еще слушаю. – user2983041

+0

Это не совсем то, что я имел в виду. В методе 'GetVolumeObject (int pid)' вместо того, чтобы возвращать только один элемент управления томом сессии, может потребоваться вернуть список, содержащий все 'ISimpleAudioVolume', которые имеют идентификатор процесса WMP и установить состояние отключения звука на всех из них. – Streamline

ответ

0

@Streamline сказал в комментарии:

В GetVolumeObject (INT ИДП) метод: вместо возврата регулятора громкости только один сеанса, один может должен вернуть список, содержащий все ISimpleAudioVolume, которые имеют идентификатор процесса WMP и установить немое состояние на всех из них.

В чем была проблема. Теперь он работает отлично.

 Смежные вопросы

  • Нет связанных вопросов^_^