我正在完成对Perixx MX-2000 IIB鼠标的linux驱动程序的反向工程。鼠标具有的功能之一是任意按钮映射。我可以分配一个按钮来产生各种键或鼠标按钮。我记录了Windows驱动程序中可用的一些按钮分配,并自己弄了一些,但似乎没有可辨认的模式(对我而言)来映射整个地址空间。这些键的行为如下:两个字节控制一个特定的鼠标按钮。我已经了解了一些键和修饰符,并将在下面发布。将鼠标按钮设置为十六进制值可在单击时为我提供键盘输出。

键盘输出|十六进制值| q | 0x0400 c | 0x0500
... z | 0x0600 1 | 0x1D00 2 | 0x1E00
... 9 | 0x1F00 0 | 0x2600返回| esc | 0x2700退格键| 0x2800标签| 0x2900空间| 0x2A00
...提高音量| 0x2B00(XF86AudioRaiseVolume)调低音量| 0x2C00(XF86AudioLowerVolume)
...

我已经通过0x8000进行了映射,但可以为您省去整个表的麻烦。有趣的是,像XF86命令这样的东西出现得很早,例如0x8100是XF86AudioMicMute,或者0x8A00是关闭电源键。一张面具。 Ctl是0x6F00,shift是0x6600,alt是(1 << 0),super / meta / windows是(1 << 1)。因此,以这种方式,shift + a(大写A)为(1 << 2)。 Ctl + Alt + a为(1<<3)。所有这四个修饰符为您提供最少的信号。字节。尝试使用LSB的高字节,比如说0x0402这样的值可以给我更多的键,例如XF86Mute。因此,似乎地址空间很大。输出|十六进制valueaMouse向上滚动| 0x0405鼠标向下滚动| 0x0F万维网搜索| 0x0440 WWW返回| 0x0143 WWW转发| 0xFF43电子邮件| 0x2122 Internet Expl返回| IE转发| 0x2422(在X11中显示为鼠标按钮8) 0x2522(鼠标按钮9) 0x8A21我的电脑| 0x8842静音| 0x9042增大音量| 0x9221降低音量| 0x9421

和几个鼠标按钮:

输出| hexLeft请点击| 0xE220右键单击| 0xE920车轮请点击| 0xEA20

最后,这些是内部鼠标命令。它们不会在我的linux机器上注册任何事件,但是会更改鼠标的内部设置中的内容。 hex

循环DPI设置| 0x8142 DPI增加| 0x8242 DPI下降| 0x8442循环鼠标配置文件| 0x034A配置文件| 0x014A简介下载| 0x004A

最后有一个特殊的集,看起来像0x074A,它内部指向宏内存。 。字母键?而且,如果您注意到了,音量调高既是0x054A0x044A,而音量调低是0x0a880x8000。隧道尽头的光线如此之大,以至于两者之间的距离是一致的。

但是,实际上,我无法弄清楚与此匹配的标准映射。还是以任何方式找出所有按键,而无需手动摆弄内存并遍历0xE9200x8100并每次单击0xEA20

有什么想法?这些熟悉吗?还是发现了其他模式?

edit:到目前为止,我映射的所有关键信息都在这个要点上,包括0x00000xFFFF(保留LSByte xev)。因此,仍然有大量的地址空间。而且对我来说,使用Windows驱动程序中的其他键(如0x0000 = XF86Explorer

)仍然没有意义。

#1 楼

这些是16位USB键盘/键盘扫描代码。有关详细信息,请参见键盘扫描代码规范。附录C包含完整的映射