Как смоделировать нажатие мультимедийной клавиши (в C)? - PullRequest
4 голосов
/ 03 июня 2010

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

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

Ответы [ 2 ]

9 голосов
/ 03 июня 2010

Используйте Windows API SendInput, если вы говорите о программировании под 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));
5 голосов
/ 20 января 2014

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