(2009-02-23 20:04:30)转载标签:杂谈 分类:symbian
(接上文)
简单的说完了,下面该唠叨唠叨iScanCode 和 iCode了。
iCode 是每次完整的按键事件对应的一个唯一键盘码,所谓完整的按键事件就是
EEvenKeyDown、EEvenKeyUp及EEvenKey 这三个事件,iCode在EEvenKeyDown和
EEvenKeyUp中均为0,只有在EEvenKey 中才对应相应的键盘码,这在SDK中有说:
The character code generated for an EEventKey, or 0 for a down or up
event.
Key codes for special keys are defined in TKeyCode.
可见,在EEvenKeyDown和EEvenKeyUp中我们无法根据iCode进行相应处理,因为所
有按键的iCode都是0,我们只能根据iScanCode来判断按下的键位并处理。那么什
么是iScanCode呢?
iScanCode在SDK中是这样描述的:
The scan code of the key that caused the event
怎么样,迷糊了吧,我们按下a这个键,不就是“a”这个键cause the event,而
且The character code generated for the EEventKey 也是a 啊,iScancode 和
iCode的区别在哪呢?别忘了,可能还有修饰键呢,如果我们只按下a,那么
iScancode = 0x41 和 iCode = 0x61(对应ASCII中小写的a),而如果我们按下
shift + a,那么iScancode = 0x41 和 iCode = 0x41(对应ASCII中大写的A)。
至于为啥小写a的iScancode 为啥是0x41而不是0x61那就得问symbian了,人家就
是这么定义的 -.-!!!
下面让我们看看两个完整的按键事件的实例:
a:
184.190 --->code :0
184.190 --->scan code :41
184.190 --->iModifiers :0
184.190 --->iRepeats :0
EEvenKeyDown:a
184.190 *********************************
184.190 --->code :61
184.190 --->scan code :41
184.190 --->iModifiers :1
184.190 --->iRepeats :0
EEvenKey :a
184.190 *********************************
184.320 --->code :0
184.320 --->scan code :41
184.320 --->iModifiers :0
184.320 --->iRepeats :0
EEvenKeyUp:a
184.320 *********************************
shift + a (实际上是左shift):
233.020 --->code :0
233.020 --->scan code :12
233.020 --->iModifiers :500
233.020 --->iRepeats :0
233.020 leftshift was pressed
EEvenKeyDown:shift
233.020 *********************************
233.210 --->code :0
233.215 --->scan code :41
233.215 --->iModifiers :500
233.215 --->iRepeats :0
233.215 leftshift was pressed
EEvenKeyDown:a
233.215 *********************************
233.215 --->code :41
233.215 --->scan code :41
233.215 --->iModifiers :501
233.215 --->iRepeats :0
233.215 leftshift was pressed
EEvenKey:shift + a
233.215 *********************************
233.340 --->code :0
233.340 --->scan code :41
233.340 --->iModifiers :500
233.340 --->iRepeats :0
233.340 leftshift was pressed
EEvenKeyUp:a
233.345 *********************************
233.680 --->code :0
233.680 --->scan code :12
233.680 --->iModifiers :0
233.680 --->iRepeats :0
EEvenKeyUp:shift
233.680 *********************************
实际上有兴趣的话可以自己随便测测其他的按键,只需要在OfferKeyEventL或
HandleKeyEventL中加入下面代码:
RDebug::Printf("--->code :%x",aKeyEvent.iCode); //需要RDebug的头文件
RDebug::Printf("--->scan code :%x",aKeyEvent.iScanCode);
RDebug::Printf("--->iModifiers :%x",aKeyEvent.iModifiers);
RDebug::Printf("--->iRepeats :%d",aKeyEvent.iRepeats);
if(aKeyEvent.iModifiers& EModifierLeftShift)
RDebug::Printf("leftshift was pressed");
if(aKeyEvent.iModifiers& EModifierShift)
RDebug::Printf("shift was pressed");
if(aKeyEvent.iModifiers& EModifierRightShift)
RDebug::Printf("rightshift was pressed");
if(aKeyEvent.iModifiers& EModifierLeftCtrl)
RDebug::Printf("leftctrl was pressed");
if(aKeyEvent.iModifiers& EModifierCtrl)
RDebug::Printf("ctrl was pressed");
if(aKeyEvent.iModifiers& EModifierRightCtrl)
RDebug::Printf("rightctrl was pressed");
RDebug::Printf("*********************************");
在调试模式下,通过carbide里面的控制台就能看到相应的按键信息了。