首页 > 解决方案 > WndProc 中的媒体键未触发

问题描述

我正在用 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()方法也适用)。

标签: c#winformswndprocmedia-keys

解决方案


报告的值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;
    }
}

编辑
关于 KeyBoard Hooks 和注册 HotKeys 的一些有意义的链接。

On SetWindowHookEx
SetWindowsHookEx WH_KEYBOARD_LL 未获取事件
C# 中的低级键盘挂钩

On RegisterHotKey
在后台捕获键盘按键


推荐阅读