Медиа ключи в WndProc не стреляют - PullRequest
0 голосов
/ 28 октября 2018

Я создаю медиаплеер в WinForms, C #.Я хочу, чтобы пользователь нажимал клавиши мультимедиа на клавиатуре, используя следующий код, который можно найти в Интернете:

public const int WM_APPCOMMAND = 0x0319;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_APPCOMMAND)
    {
        switch ((int)m.LParam)
        {
            case 14: // MediaPlayPause
                TogglePlayPause();
                break;
            default:
                break;
        }
    }
    base.WndProc(ref m);
}

Но это не сработает.Он просто никогда не получает ключевую команду.Клавиши мультимедиа работают с любым другим приложением (и метод TogglePlayPause() также работает).

1 Ответ

0 голосов
/ 28 октября 2018

Значение, сообщаемое LParam, является составным.

Как указано в Документах, около WM_APPCOMMAND значение может быть извлечено с помощью:

cmd  = GET_APPCOMMAND_LPARAM(lParam);
uDevice = GET_DEVICE_LPARAM(lParam);
dwKeys = GET_KEYSTATE_LPARAM(lParam);

Вам необходимо значение cmd.

В C# его можно кодировать как:

private const int WM_APPCOMMAND = 0x0319;
private const int APPCOMMAND_MEDIA_PLAY_PAUSE = 14;

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    switch (m.Msg)
    {
        case WM_APPCOMMAND:
            int cmd = (int)m.LParam >> 16 & 0xFF;
            switch (cmd)
            {
                case APPCOMMAND_MEDIA_PLAY_PAUSE:
                    TogglePlayPause();
                    break;
                default:
                    break;
            }
            m.Result = (IntPtr)1;
            break;
        default:
            break;
    }
}

Edit :
Некоторые значимые ссылки о KeyBoard Hooks и регистрации HotKeys.

On SetWindowHookEx:
SetWindowsHookEx WH_KEYBOARD_LL не получает события
Низкий уровень Крючок клавиатуры в C #

Вкл. RegisterHotKey:
Захват нажатия клавиш клавиатуры вфон

...