Я использую следующий код ответа 2 для отключения внешних игроков, таких как vlc или windows media player.Can not mute windows media player по id процесса
Controlling Application's Volume: By Process-ID
Игрок VLC правильно приглушен. Но Windows Media Player этого не делает.
Визуально он правильно мутирован, как показано на следующем изображении. Но я все еще слышу звук через динамики. Когда я удаляю приглушение звука (приглушение приложения), и я помещаю его вручную с помощью мыши, он отключается правильно.
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 всегда было больше одного сеанса аудио, поэтому мне пришлось установить громкость на каждом из этих сеансов. Возможно, вам придется изменить реализацию класса «VolumeMixer» таким образом, чтобы каждый сеанс с идентификатором процесса WMP был отключен. – Streamline
Я выполнил следующий тест: я получил все запущенные процессы «Process.GetProcesses()», и я отключил звук всего процесса. То же самое происходит. Бар понижен, но я все еще слушаю. – user2983041
Это не совсем то, что я имел в виду. В методе 'GetVolumeObject (int pid)' вместо того, чтобы возвращать только один элемент управления томом сессии, может потребоваться вернуть список, содержащий все 'ISimpleAudioVolume', которые имеют идентификатор процесса WMP и установить состояние отключения звука на всех из них. – Streamline