2012年7月31日星期二

如何干死thinkpad usb keyboard的前进/后退键

把方向键旁边俩键设为浏览器的前进/后退键真是脑残无比的决定,不妨想象一下你在浏览器某页面操作了半天,需要按方向键切输入焦点,然后一个不小心按到了旁边的后退键,然后你的浏览器又没有opera这样的快进/退功能或者页面太多ajax让这个功能失效了,你就哭去吧……

幸好sl400虽然种种不是,键位安排还是靠谱的,那俩键默认是page up/down,而且相对于传统的tp键盘方向键距离home/end十万八千里,sl400的“阉割版”键盘还算把这几个键放得相对靠近。当然为什么来弄我不能把page up/down、home/end放回车键的右边一竖条而非要放到遥远的第7排我是永远无法理解的,就像我无法理解来弄我为什么宁可键盘左右放音箱或者干脆空一大片也不肯加多一个小键盘一样。

外接的usb键盘就没有这么好的事情了,默认就是前进/后退,而且驱动就是一坨屎。以前还提供了设置工具来更改这俩键功能,现在Keyboard Customizer Utility又不更新了(来弄我为啥总喜欢阉割掉为数不多有用的随机软件而非要塞一大堆毫无用处的垃圾进去我也是不能理解的),只好用hoekey搞定:
@LEFT=Keys|\f
@RIGHT=Keys|\g
映射成page up/down

幸好来弄我是发送alt+left/right而不是直接发送166/167的key code,要不然我还真不知道怎么在不废掉鼠标的前进后退键的情况下搞定这俩按键。

[update]
再研究了一下tp usb kb的功能键,差不多能猜到之前说的驱动会导致输入产生巨大的dpc延迟的原因了。有很多功能键发送的都是按键序列,比如麦克风静音就是F1+num8,增加屏幕亮度就是keycode 172+space,thinkvantage是keycode 240+space。然后我猜那个所谓的驱动的处理呢,就是去截获全部键盘输入,然后等待下一个keycode送进来,如果符合组合键的情况就执行某种动作,如果不符合,就原样送出去。这就导致一个问题,就是正常的单个按键事件也会被截获,然后如果没有下一个keycode进来,就得有办法判定是单个按键而不继续等待下一个keycode,然后送出去。最简单粗暴的方式就是设置一个超时时间,当接收到第一个keycode时,如果超过超时时间还没有收到下一个keycode,就送出,否则按照序列处理。而dpc延迟就来自于这个超时。

如果驱动真是这样处理的话,我只能说,来弄我你赢了。既然做了驱动,那我想不出你送出一个自定义的keycode给驱动去处理有什么障碍(就像罗技的键盘做的那样),反正没有驱动的时候不管你是送出一个常规keycode组成的序列,还是一个自定义的keycode,系统都是处理不了的。

我总觉得,来弄我你除了大把花钱去搞市场和养闲人以外,是不是能稍微抽出点钱,招几个合格的程序员呢?

没有评论:

发表评论