2010-06-03 33 views
3

Les claviers modernes ont des touches multimédia spéciales, par ex. 'Pause/Lecture' ou 'Ouvrir le navigateur Web'. Est-il possible d'écrire un programme qui "appuie" sur ces touches?Comment simuler une touche multimédia (en C)?

Je préférerais la solution en C, mais j'accepterais aussi une solution agnostique en langage.

+1

Langue agnostique? Je pense que vous devez vous soucier de l'agnostic du système d'exploitation. Une solution, quelle que soit la langue dans laquelle elle est implémentée, devra cibler un système d'exploitation spécifique. –

Répondre

7

Utilisez l'API SendInput Windows si vous parlez de la programmation sous Win32.

Vous devez créer des structures INPUT en définissant le membre de type sur INPUT_KEYBOARD. Dans le membre ki (type KEYBDINPUT), vous pouvez définir vk (clé virtuelle) sur le code VK souhaité (par exemple, VK_MEDIA_NEXT_TRACK, VK_MEDIA_STOP).

codes clés virtuels: http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx

SendInput Fonction: http://msdn.microsoft.com/en-us/library/ms646310(v=VS.85).aspx

Je n'ai pas testé ce qui suit, mais devrait être comme ceci:

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

encore plus facile que la réponse acceptée est keybd_event. Non structure seulement un appel avec des paramètres numériques.

// 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);