2010-06-03 132 views
3

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

我更喜欢C语言的解决方案,但我也会接受语言不可知的解决方案。

+1

语言不可知的?我认为你需要担心操作系统不可知论。无论使用哪种语言,解决方案都必须针对特定的操作系统。 – 2010-06-03 19:31:53

回答

7

如果您正在讨论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)); 
4

更容易比接受的答案是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);