Как имитировать нажатие мультимедийного ключа (в C)?

Современные клавиатуры имеют специальные мультимедийные клавиши, например «Пауза / Воспроизведение» или «Открыть веб-браузер». Можно ли написать программу, которая «нажимает» эти клавиши?

Я бы предпочел решение в C, но я бы тоже принял языковое агностическое решение.

Используйте API-интерфейс SendInput Windows, если вы говорите о программировании под Win32.

Вам нужно построить структуры 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)); 

Еще проще, чем принятый ответ – 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);