在Windows Media Center C#之外使用远程控制输入

时间:2014-05-04 20:57:34

标签: c# windows center media remote-control

我想制作一个非常简单的C#windows窗体应用程序(或WPF),它可以由计算机附带的Media Center Remote Control控制。 它是一个非常简单的应用程序,它有一个事件监听器,它从远程接收消息并调用相应的函数。 我发现这篇文章解释了如何做到这一点但我无法跟进: http://msdn.microsoft.com/en-us/library/windows/desktop/bb417079.aspx 我已多次阅读这篇文章,但我不知道如何执行它。 我是HID编程的新手, 所以请尽量保持清晰和详细。 一个完整的例子将不胜感激。 谢谢

谢谢Corey您的回答非常有帮助,我将其与我发现的其他代码混合在一起: http://discuss.mediacentersandbox.com/forums/thread/8549.aspx 它工作了

1 个答案:

答案 0 :(得分:1)

我没有Media Center Remote可以测试,但我可以找到...

按MC遥控器上的按钮将导致向您的应用程序发送三种类型的消息之一:WM_APPCOMMAND,WM_KEYDOWN或WM_INPUT。前两个相当简单 - 只是合成键盘交互。第三个是困难的。

首先,您需要使用RAWINPUTDEVICE结构数组来调用RegisterRawInputDevices,以指示您的应用程序感兴趣的数据。在这种情况下,您至少需要页面0x000C集合0x​​01和页面0xFFBC集合0x​​88获取大多数按钮。如果你想处理Standyby按钮,你还需要页面0x0001集合0x80。

在通话结束后,您将获得每个按钮的WM_INPUT消息。这是我目前所能做的,因为除了它可以包含多个事件的数据之外,我还没有找到对HIDRAW结构内容的合理解释。我建议将其转储出来,看看是否可以找到相应的代码 - 来自Button Usage ID列。


编辑:处理消息

为了处理WM_APPCOMMAND消息,您需要覆盖表单的WndProc方法:

// Some of the named constants:
const int WM_APPCOMMAND = 0x0319;
const int APPCOMMAND_BROWSER_BACK = 1;
const int APPCOMMAND_MEDIA_CHANNEL_DOWN = 52;
const int APPCOMMAND_MEDIA_CHANNEL_UP = 51;
const int APPCOMMAND_MEDIA_FAST_FORWARD = 49;
const int APPCOMMAND_VOLUME_MUTE = 8;
const int APPCOMMAND_MEDIA_PAUSE = 14;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_APPCOMMAND)
    {
        int lParam = unchecked ((int)m.LParam);
        int cmd = unchecked ((short)((uint)lParam>>16));
        switch (cmd)
        {
            case APPCOMMAND_BROWSER_BACK:
                // process 'back' button
                break;

            case APPCOMMAND_MEDIA_CHANNEL_DOWN:
                // process 'channel down' command
                break;
        }
    }
    base.WndProc(ref m);
}

还有更多,但这是它的要点。您需要找到各种命名常量的值。