2

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

2 に答える 2

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);
}
于 2013-01-22T17:39:27.277 に答える
0

サウンドを再生する呼び出しをラップする場合、これらの関数にリソースをチェックさせて、ユーザーがサウンドをミュートすることを選択したかどうかを示すことができます。次に例を示します。

public void PlaySoundXYZ() 
{
   if(!MuteSource.IsMuted()) 
   {
        // play sound.
   }
}
于 2013-01-22T17:43:54.163 に答える