2013-01-22 36 views
2

我希望將聲音靜音爲僅用於我的WPF應用程序,並根據用戶的設置保留整體調音臺。將SoundPlayer靜音僅用於我的應用程序

我可以使用以下代碼將系統廣播聲音靜音/取消靜音。

但我注意到當我的應用程序正在運行並且聲音在播放時,我的應用程序出現在Windows混音器中,我可以通過調音臺的用戶界面將應用程序靜音/取消靜音,這樣看起來應該可以讓我的應用程序以編程方式進行。

private const int APPCOMMAND_VOLUME_MUTE = 0x80000; 
private const int WM_APPCOMMAND = 0x319; 

[DllImport("user32.dll")] 
public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); 

SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr) APPCOMMAND_VOLUME_MUTE); 
+1

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

[Controling Volume Mixer]的可能重複(http://stackoverflow.com/questions/14306048/controling-volume-mixer) –

回答

5

此工程在Vista/7/8如果您纏繞調用播放聲音,你可以擁有這些功能檢查一些資源,以指示在那裏是每個應用程序的音量控制

DllImport("winmm.dll")] 
private static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume); 

[DllImport("winmm.dll")] 
private static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume); 

/// <summary> 
/// Returns volume from 0 to 10 
/// </summary> 
/// <returns>Volume from 0 to 10</returns> 
public static int GetVolume() 
{ 
    uint CurrVol = 0; 
    waveOutGetVolume(IntPtr.Zero, out CurrVol); 
    ushort CalcVol = (ushort)(CurrVol & 0x0000ffff); 
    int volume = CalcVol/(ushort.MaxValue/10); 
    return volume; 
} 

/// <summary> 
/// Sets volume from 0 to 10 
/// </summary> 
/// <param name="volume">Volume from 0 to 10</param> 
public static void SetVolume(int volume) 
{ 
    int NewVolume = ((ushort.MaxValue/10) * volume); 
    uint NewVolumeAllChannels = (((uint)NewVolume & 0x0000ffff) | ((uint)NewVolume << 16)); 
    waveOutSetVolume(IntPtr.Zero, NewVolumeAllChannels); 
} 
+1

這不是一個答案。這是爲應用程序設置音量的正確方法,但不能將其靜音。在窗口混音器中靜音會記住「unmute」的前一個值,將其設置爲0不會。 – Matyas

0

用戶選擇將聲音靜音或不靜音,例如:

public void PlaySoundXYZ() 
{ 
    if(!MuteSource.IsMuted()) 
    { 
     // play sound. 
    } 
} 
相關問題