使用 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 和停止功能,因此最好结合使用这两种选项。
我正在尝试构建自己的混音器面板并让硬件和软件通信端正常工作,现在我需要的只是使用它来控制计算机上的媒体。我如何在 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 和停止功能,因此最好结合使用这两种选项。