如何模拟多媒体按键(在C中)?

Tom*_*rek 4 c key keypress simulate

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

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

Her*_*nán 9

如果您正在谈论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

SendInput功能: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));
Run Code Online (Sandbox Code Playgroud)


Bit*_*lue 5

比接受的答案更容易的是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);
Run Code Online (Sandbox Code Playgroud)