发送多媒体命令

本文关键字:命令 多媒体 | 更新日期: 2023-09-27 18:00:32

有没有办法将下一首歌、暂停、播放、音量增大等多媒体控制命令发送到操作系统?按下Fn+一些映射的时发送的命令。。键。我正在为电脑制作一个遥控器,发送这些命令是必不可少的。

发送多媒体命令

您可以使用keybd_event来模拟按键,您必须模拟向下键然后向上键才能正确识别

    [DllImport("user32.dll", SetLastError = true)]
    public static extern void keybd_event(byte virtualKey, byte scanCode, uint flags, IntPtr extraInfo);
    public const int VK_MEDIA_NEXT_TRACK = 0xB0;
    public const int VK_MEDIA_PLAY_PAUSE = 0xB3;
    public const int VK_MEDIA_PREV_TRACK = 0xB1;
    public const int KEYEVENTF_EXTENDEDKEY = 0x0001; //Key down flag
    public const int KEYEVENTF_KEYUP = 0x0002; //Key up flag
    private void ButtonClick(object sender, EventArgs e)
        keybd_event(VK_MEDIA_PREV_TRACK, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
        keybd_event(VK_MEDIA_PREV_TRACK, 0, KEYEVENTF_KEYUP, IntPtr.Zero);
    }`

实际上,dxramax的答案给了我不稳定的行为。我发布的这个答案给了我一贯的行为,也有更多的细节

要发送多媒体按键,包括播放/暂停下一个曲目上一个曲目等,您可以使用keybd_event:

public class Program
{
    public const int KEYEVENTF_EXTENTEDKEY = 1;
    public const int KEYEVENTF_KEYUP = 0;
    public const int VK_MEDIA_NEXT_TRACK = 0xB0;
    public const int VK_MEDIA_PLAY_PAUSE = 0xB3;
    public const int VK_MEDIA_PREV_TRACK = 0xB1;
    [DllImport("user32.dll")]
    public static extern void keybd_event(byte virtualKey, byte scanCode, uint flags, IntPtr extraInfo);
    public static void Main(string[] args)
    {
        keybd_event(VK_MEDIA_PLAY_PAUSE, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);    // Play/Pause
        //keybd_event(VK_MEDIA_PREV_TRACK, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);  // PrevTrack
        //keybd_event(VK_MEDIA_NEXT_TRACK, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);  // NextTrack
    }

以下是此windows api可以处理的受支持密钥代码的列表:
https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes

SendKeys类非常不错,但也有局限性。上述方法将密钥命令直接发送到Windows操作系统。

如果有人像我一样在这个页面上想知道。上面所有的帖子都不起作用,你还需要第二个参数bScan,你可以用MapVirutalKey(VKCode,0)来获得它。

例如:

      int keyValue = VK_MEDIA_NEXT_TRACK;
      keybd_event(keyValue, MapVirtualKey(keyValue, 0), KEYEVENTF_KEYUP, 0);
      keybd_event(keyValue, MapVirtualKey(keyValue, 0), KEYEVENTF_KEYUP, 0);

遗憾的是,在大多数情况下,密钥Fn无法使用Windows API发送,因此无法使用.NET类发送。这取决于制造商是如何实现这一功能的。可能是由额外的驱动程序支持,甚至是由操作系统支持。

您可以通过尝试使用Windows API代码或AutoHotKey等应用程序挂接代码来检查是否可以从代码中发送Fn命令。例如,在我的笔记本电脑上,我无法连接多媒体命令。

否则,如果幸运的话,请使用注释中提到的SendKeys。