【问题标题】:How to simulate multimedia key press (in C)?如何模拟多媒体按键(C)?
【发布时间】:2011-02-27 11:41:34
【问题描述】:

现代键盘具有特殊的多媒体键,例如“暂停/播放”或“打开网络浏览器”。是否可以编写一个“按下”这些键的程序?

我更喜欢 C 中的解决方案,但我也接受与语言无关的解决方案。

【问题讨论】:

  • 语言不可知?我认为您需要担心与操作系统无关。解决方案,无论采用哪种语言实现,都必须针对特定的操作系统。

标签: c key keypress simulate


【解决方案1】:

如果您正在谈论在 Win32 下编程,请使用 SendInput Windows API。

您需要构建 INPUT 结构,将类型成员设置为 INPUT_KEYBOARD。在 ki 成员(KEYBDINPUT 类型)中,您可以将 vk(虚拟密钥)设置为您想要的 VK 代码(例如,VK_MEDIA_NEXT_TRACK、VK_MEDIA_STOP)。

虚拟键码:http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx

发送输入函数:http://msdn.microsoft.com/en-us/library/ms646310(v=VS.85).aspx

我没有测试过以下,但应该是这样的:

KEYBDINPUT kbi;
kbi.wVk = VK_MEDIA_STOP; // Provide your own
kbi.wScan = 0;
kbi.dwFlags = 0;  // See docs for flags (mm keys may need Extended key flag)
kbi.time = 0;
kbi.dwExtraInfo = (ULONG_PTR) GetMessageExtraInfo();

INPUT input;
input.type = INPUT_KEYBOARD;
input.ki   = kbi;

SendInput(1, &input, sizeof(INPUT));

【讨论】:

    【解决方案2】:

    比公认的答案更容易的是keybd_event没有结构,只是一个带有数字参数的调用。

    // C# example:
    public const int KEYEVENTF_EXTENDEDKEY = 1;
    public const int KEYEVENTF_KEYUP = 2;
    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", SetLastError = true)]
    public static extern void keybd_event(byte virtualKey, byte scanCode, uint flags, IntPtr extraInfo);
    
    keybd_event(VK_MEDIA_PREV_TRACK, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-07
      • 2021-05-09
      • 2012-05-14
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      相关资源
      最近更新 更多