【问题标题】:Mute Windows Volume using C#使用 C# 使 Windows 音量静音
【发布时间】:2010-09-14 07:44:22
【问题描述】:

有人知道如何使用 C# 以编程方式使 Windows XP 卷静音吗?

【问题讨论】:

  • 在Vista/Win7下可以吗?
  • Vista 及以上版本必须使用 IAudioEndpointVolume。

标签: c# winforms audio volume


【解决方案1】:

为 P/Invoke 声明这个:

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

【讨论】:

  • 在 XP 中工作,谢谢。但是我使用的是 WPF,所以没有 this.Handle。而是:public static void ToggleMute(IntPtr handle) { SendMessageW(handle, WM_APPCOMMAND, handle, (IntPtr)APPCOMMAND_VOLUME_MUTE); } 在 WPF 窗口中:VolumeXP.ToggleMute(new WindowInteropHelper(this).Handle);
  • 这...在 Windows 7 上工作——但我在一个库中,它在后台运行——而不是任何有窗口的东西——我正在尝试静音另一个窗口——这有效——但不管我为句柄传递什么(另一个应用程序的窗口句柄等),它只会使主系统音量静音......
  • 你为什么使用0x80000APPCOMMAND_VOLUME_MUTE 定义为8?但是,当我使用 8 时它会失败,但是当我使用你的 0x80000 时它会起作用。这很奇怪。
  • 这里为什么给出 0x80000 的解决方案 - stackoverflow.com/a/40577881/1828637
  • 不错!您可以改用 APPCOMMAND_VOLUME_UP 0xA0000 来确保不会像闹钟一样静音。
【解决方案2】:

您可以在 Windows Vista/7 和 8 中使用什么:

您可以使用NAudio
下载最新版本。提取 DLL 并在 C# 项目中引用 DLL NAudio。

然后添加以下代码以遍历所有可用的音频设备并尽可能将其静音。

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
        {
            //Show us the human understandable name of the device
            System.Diagnostics.Debug.Print(dev.FriendlyName);
            //Mute it
            dev.AudioEndpointVolume.Mute = true;
        }
        catch (Exception ex)
        {
            //Do something with exception when an audio endpoint could not be muted
        }
    }
}
catch (Exception ex)
{
    //When something happend that prevent us to iterate through the devices
}

【讨论】:

  • 谢谢。当我尝试过的所有其他人都失败时,这个库就起作用了。我的问题与此类似,但不完全相同。这是一个很好的发现。我希望我能不止一次投票给你。
  • 感谢您的支持和反馈。在找到一种简单的静音方法之前,我搜索了一段时间。因此,我想,在一些 stackoverflow 问题上传播知识:) 我很高兴它帮助了某人。
【解决方案3】:

我遇到了this project,如果您运行的是 Vista,您可能会感兴趣。

【讨论】:

    【解决方案4】:

    How to programmatically mute the Windows XP Volume using C#?

    void SetPlayerMute(int playerMixerNo, bool value)
    {
        Mixer mx = new Mixer();
        mx.MixerNo = playerMixerNo;
        DestinationLine dl = mx.GetDestination(Mixer.Playback);
        if (dl != null)
        {
            foreach (MixerControl ctrl in dl.Controls)
            {
                if (ctrl is MixerMuteControl)
                {
                    ((MixerMuteControl)ctrl).Value = (value) ? 1 : 0;
                    break;
                }
            }
        }
    }
    

    【讨论】:

      【解决方案5】:

      您可能想要使用 MCI 命令: http://msdn.microsoft.com/en-us/library/ms709461(VS.85).aspx

      我应该补充一点,虽然这可以让您在 Windows 中很好地控制输入和输出混音器,但您在进行详细控制时可能会遇到一些困难,例如设置麦克风增强等。

      哦,如果您使用的是 Vista,那就别管它了。这是一个完全不同的模型。

      【讨论】:

        【解决方案6】:

        您可以按照此处的说明使用 P/Invoke:http://www.microsoft.com/indonesia/msdn/pinvoke.aspx。它实际上完成了任务 1:靠近顶部的静音和取消静音中的步骤。

        【讨论】:

          【解决方案7】:

          这是 Mike de Klerks 答案的略微改进版本,不需要“on error resume next”代码。

          第 1 步:将 NAudio NuGet 包添加到您的项目 (https://www.nuget.org/packages/NAudio/)

          第 2 步:使用此代码:

          using (var enumerator = new NAudio.CoreAudioApi.MMDeviceEnumerator())
          {
              foreach (var device in enumerator.EnumerateAudioEndPoints(NAudio.CoreAudioApi.DataFlow.Render, NAudio.CoreAudioApi.DeviceState.Active))
              {
                  if (device.AudioEndpointVolume?.HardwareSupport.HasFlag(NAudio.CoreAudioApi.EEndpointHardwareSupport.Mute) == true)
                  {
                      Console.WriteLine(device.FriendlyName);
                      device.AudioEndpointVolume.Mute = false;
                  }
              }
          }
          

          【讨论】:

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