Esclusione / triggerszione audio, Modifica volume principale in Windows 7 x64 con C #

Come posso regolare il volume principale in Windows 7 con C #?

Ho visto un’eccellente implementazione usando winmm.dll qui , ma funziona con XP e non con Windows 7.

CodeProject ha un ottimo esempio qui . Notare che si basa completamente sull’interfaccia COM (controllare l’interfaccia COM come IAudioEndpointVolume e IAudioMeterInformation su MSDN se si è interessati ai dettagli di implementazione) e funziona SOLO per Vista / Win7 e versioni successive.

Client minimo supportato: Windows Vista

Server minimo supportato: Windows Server 2008

Ho usato il pacchetto nuget Naudio con successo con questo codice:

public void SetVolume(int level) { try { //Instantiate an Enumerator to find audio devices NAudio.CoreAudioApi.MMDeviceEnumerator MMDE = new NAudio.CoreAudioApi.MMDeviceEnumerator(); //Get all the devices, no matter what condition or status NAudio.CoreAudioApi.MMDeviceCollection DevCol = MMDE.EnumerateAudioEndPoints(NAudio.CoreAudioApi.DataFlow.All, NAudio.CoreAudioApi.DeviceState.All); //Loop through all devices foreach (NAudio.CoreAudioApi.MMDevice dev in DevCol) { try { if (dev.State == NAudio.CoreAudioApi.DeviceState.Active) { var newVolume = (float)Math.Max(Math.Min(level, 100),0) / (float)100; //Set at maximum volume dev.AudioEndpointVolume.MasterVolumeLevelScalar = newVolume; dev.AudioEndpointVolume.Mute = level == 0; //Get its audio volume _log.Info("Volume of " + dev.FriendlyName + " is " + dev.AudioEndpointVolume.MasterVolumeLevelScalar.ToString()); } else { _log.Debug("Ignoring device " + dev.FriendlyName + " with state " + dev.State); } } catch (Exception ex) { //Do something with exception when an audio endpoint could not be muted _log.Warn(dev.FriendlyName + " could not be muted with error " + ex); } } } catch (Exception ex) { //When something happend that prevent us to iterate through the devices _log.Warn("Could not enumerate devices due to an excepion: " + ex.Message); } }