【问题标题】:Media keys in WndProc not firingWndProc 中的媒体键未触发
【发布时间】:2019-04-01 06:48:42
【问题描述】:

我正在用 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# winforms wndproc media-keys


    【解决方案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;
        }
    }
    

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

    开启SetWindowHookEx
    SetWindowsHookEx WH_KEYBOARD_LL not getting events
    Low-Level Keyboard Hook in C#

    开启RegisterHotKey:
    Capture a keyboard keypress in the background

    【讨论】:

    • 这可以完美地工作,但只有当窗口被聚焦时。即使应用程序被最小化,有没有办法让它工作?
    • @Jonas Kohl 您需要一个 KeyBoard Hook 或 HotKeys,这取决于您的应用程序的工作方式(以及您管理并发问题的能力)。链接到编辑中的两种方法。然而,这是一个不同的问题,而且是一个相当广泛的问题。如果您在实现其中一种方法时遇到任何问题(不要同时使用这两种方法),请提出另一个问题。
    猜你喜欢
    • 2014-08-10
    • 1970-01-01
    • 2021-12-26
    • 2015-05-15
    • 1970-01-01
    • 2017-10-18
    • 2015-09-15
    • 2021-11-28
    • 2017-12-18
    相关资源
    最近更新 更多