2014-01-24 2 views
1

Следующий код работает отлично:RegisterHotKey не работает MediaPlayPause

public class HotKeys 
{ 
    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk); 
    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    public static extern bool UnregisterHotKey(IntPtr hWnd, int id); 

    public enum KeyModifier 
    { 
     None = 0, 
     Alt = 1, 
     Control = 2, 
     Shift = 4, 
     WinKey = 8 
    } 
} 
... 

RegisterHotKey(this.Handle, id, (int)HotKeys.KeyModifier.None, (int)Keys.Add) 

Я могу слушать сообщения WndProc для Msg 0x312, и я вижу, что горячая клавиша «Добавить» была нажата, даже если мое окно не имеет фокус. Я не могу видеть это сообщение прибывает в моем приложении:

msg=0x312 (WM_HOTKEY) hwnd=0x4c19ee wparam=0x0 lparam=0x6b0000 result=0x0 

Если я просто изменить это зарегистрировать Keys.MediaPlayPause, он больше не работает из любого приложения. Когда я нажимаю клавишу, сообщения не получаются вообще. Но я думаю, что это правильный ключ, потому что если я ставлю фокус на окно и нажмите его, я вхожу следующее сообщение:

msg=0x319 hwnd=0x4c19ee wparam=0x0 lparam=0xe0000 result=0x0 

Таким образом, вопрос, почему я не могу зарегистрировать этот конкретный ключ в качестве глобальной горячей клавиши ? Я уже проверял, что он не используется, и звонок в RegisterHotKey был успешным.

+1

IIRC медиа-ключи отправляются как wm_appcommands (0x319), а не как ключевые сообщения, вы можете проверить это, ища ключевые сообщения, если вы затормозите кнопку на вашем сфокусированном окне и сравниваете ее с тем, что вы видите, мультимедийный ключ –

ответ

1

СМИ Ключи могут быть довольно сложны, поскольку они действуют совершенно иначе, чем обычные нажатия клавиш, часто отличающиеся от каждого производителя. Некоторые клавиши будут переведены в ваше сообщение на WM_APPCOMMAND (0x0319).

Лучшим подходом является использование low-level keyboard hook (WH_KEYBOARD_LL). Для этого потребуется немного кода P/Invoke, но вам не нужна неуправляемая библиотека C++.

Смежные вопросы