c# - 使用 C# 控制媒体和应用程序卷

标签 c# audio serial-port media mixer

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

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

最佳答案

为了控制媒体,您可以通过连接到 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);
    }
}

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

关于c# - 使用 C# 控制媒体和应用程序卷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61068483/

相关文章:

java - AudioClip没有声音-Java

serial-port - WINE中串口访问错误

ios - AudioQueueStart 返回 561015905 (AVAudioSessionErrorCodeCannotStartPlaying)

java - 为什么我的 MIDI 程序没有完成/关闭?

java - 如何将这个特定的 RFID 读取器与 Arduino 连接并获取 Java 的输入?

linux - 内核如何通过sysrq -g进入kdb模式?

c# - nameof 不会反射(reflect)使用

c# - Action 委托(delegate)中的任务实例

c# - 带有 char 数组的非托管联合

c# - Windows Azure 服务管理 API 交换问题