使用 C# 控制媒体和应用程序音量

Using C# to control media en application volumes

我正在尝试构建自己的混音器面板并让硬件和软件通信端正常工作,现在我需要的只是使用它来控制计算机上的媒体。我如何在 window 的计算机上控制媒体和音量之类的东西,我编写的程序是用 C# 编写的,并通过串行通信到我基于 Arduino 的调音台。我四处搜索,但找不到很多关于使用 C# 或音量控制控制媒体的信息,标准 C# 库中似乎没有关于此的内容。

我希望它能够像这样跳过歌曲或返回并执行标准媒体控制。我也有不同的音量滑块,想用它来控制不同应用程序的音量。

为了控制媒体,您可以使用虚拟键盘输入,方法是挂接到 user32 DLL 以虚拟按下媒体控制键。通过这种方式,您可以执行静音和跳到下一首曲目等操作,但音量控制仅限于像普通键盘一样控制主设备音量。下面是一个简单的代码片段,说明如何执行此操作。

public class VirtualMediaController
{
    internal enum VirtualKeyCodes
        : uint
    {
        VOLUME_MUTE = 0xAD,
        VOLUME_DOWN = 0xAE,
        VOLUME_UP = 0xAF,
        NEXT_TRACK = 0xB0,
        PREVIOUS_TRACK = 0xB1,
        STOP = 0xB2,
        PLAY_PAUSE = 0xB3,
        LAUNCH_MEDIA = 0xB5,
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    internal static extern void keybd_event(uint bVk, uint bScan, uint dwFlags, uint dwExtraInfo);

    internal static void SendKey(VirtualKeyCodes virtualKeyCode)
    {
        keybd_event((uint)virtualKeyCode, 0, 0, 0);
    }

    public static void Mute()
    {
        SendKey(VirtualKeyCodes.VOLUME_MUTE);
    }

    public static void VolumeDown()
    {
        SendKey(VirtualKeyCodes.VOLUME_DOWN);
    }

    public static void VolumeUp()
    {
        SendKey(VirtualKeyCodes.VOLUME_UP);
    }

    public static void NextTrack()
    {
        SendKey(VirtualKeyCodes.NEXT_TRACK);
    }

    public static void PreviousTrack()
    {
        SendKey(VirtualKeyCodes.PREVIOUS_TRACK);
    }

    public static void Stop()
    {
        SendKey(VirtualKeyCodes.STOP);
    }

    public static void PlayPause()
    {
        SendKey(VirtualKeyCodes.PLAY_PAUSE);
    }

    public static void LaunchMedia()
    {
        SendKey(VirtualKeyCodes.LAUNCH_MEDIA);
    }
}

要获得更准确的音量控制,您将不得不使用一个库或构建一个可以连接到 windows 混音器 API 的库。 CoreAudio Github 就是这样一个库的例子,可以作为跳转点。它可用于控制音频输出设备,并为您提供更精细的音频控制,然后仅使用可视键盘的媒体键(音量增大、音量减小和静音)。通过这种方式,您还可以获得当前音量和静音状态等信息。但是这种类型的库不会为您提供 play/pause 和停止功能,因此最好结合使用这两种选项。