【问题标题】:Mute SoundPlayer for just my app只为我的应用程序静音 SoundPlayer
【发布时间】:2013-01-22 16:45:18
【问题描述】:

我希望仅为我的 WPF 应用程序静音,并让整个混音器保持用户设置的状态。

我可以使用以下代码将系统范围的声音静音/取消静音。

但我注意到,当我的应用程序正在运行并且正在播放声音时,我的应用程序出现在 Windows 混音器中,我可以通过混音器的 UI 将我的应用程序静音/取消静音,因此我的应用程序似乎应该可以这样做它以编程方式。

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);

【问题讨论】:

标签: c# audio


【解决方案1】:

这在 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);
}

【讨论】:

  • 这不是答案。这是为应用程序设置音量的正确方法,但不能将其静音。在 windows 混音器中将其静音会记住“取消静音”的先前值,将其设置为 0 则不会。
【解决方案2】:

如果你包装了播放声音的调用,你可以让这些函数检查一些资源,以指示用户是否选择了静音,例如:

public void PlaySoundXYZ() 
{
   if(!MuteSource.IsMuted()) 
   {
        // play sound.
   }
}

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2013-09-15
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多