我想制作一个非常简单的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 它工作了
答案 0 :(得分:1)
我没有Media Center Remote可以测试,但我可以找到...
按MC遥控器上的按钮将导致向您的应用程序发送三种类型的消息之一:WM_APPCOMMAND,WM_KEYDOWN或WM_INPUT。前两个相当简单 - 只是合成键盘交互。第三个是困难的。
首先,您需要使用RAWINPUTDEVICE
结构数组来调用RegisterRawInputDevices
,以指示您的应用程序感兴趣的数据。在这种情况下,您至少需要页面0x000C集合0x01和页面0xFFBC集合0x88获取大多数按钮。如果你想处理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);
}
还有更多,但这是它的要点。您需要找到各种命名常量的值。