WndProc中的媒体密钥无法触发

时间:2018-10-27 22:33:12

标签: c# winforms wndproc media-keys

我正在用C#在WinForms中创建一个媒体播放器。我想使用在互联网上可以找到的以下代码来响应用户按下键盘上的多媒体键:

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 :(得分:1)

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;
    }
}

修改
关于键盘挂钩和注册热键的一些有意义的链接。

SetWindowHookEx上:
SetWindowsHookEx WH_KEYBOARD_LL not getting events
Low-Level Keyboard Hook in C#

RegisterHotKey上:
Capture a keyboard keypress in the background