我没有要测试的媒体中心遥控器,但从我能找到的...
按下 MC 遥控器上的按钮将导致三种类型的消息之一发送到您的应用程序:WM_APPCOMMAND、WM_KEYDOWN 或 WM_INPUT。前两个相当简单——只是合成键盘交互。三是难度较大。
首先,您需要使用指示应用程序感兴趣的数据RegisterRawInputDevices
的结构数组进行调用RAWINPUTDEVICE
。在这种情况下,您至少需要 Page 0x000C Collection 0x01 和 Page 0xFFBC Collection 0x88 才能获得大部分按钮。如果要处理待机按钮,还需要页面 0x0001 集合 0x80。
在那次通话之后,您将收到每个按钮的 WM_INPUT 消息。这是我目前所能做到的,因为除了它可以包含多个事件的数据这一事实之外,我还没有找到对 HIDRAW 结构内容的体面解释。我建议把它扔掉,看看你是否能找到合适的代码——从按钮使用 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);
}
还有更多,但这就是它的要点。您需要找到各种命名常量的值。