0

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()方法も同様に機能します)。

4

1 に答える 1

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

編集
キーボードフックとホットキーの登録に関するいくつかの意味のあるリンク。

On SetWindowHookEx:
SetWindowsHookEx WH_KEYBOARD_LL がイベントを取得しない
C# の低レベル キーボード フック

On RegisterHotKey:
バックグラウンドでキーボードのキープレスをキャプチャします

于 2018-10-27T22:50:29.493 に答える