一、简单说明一下Symbian OS处理按键的流程:
Symbian OS是一个事件驱动的系统,所有的应用程序和服务都可以被看作是事件处理器。
当用户按下一个键后,keyboard hardware就会生成一个中断,由keyboard driver捕捉,之后分解出这次按键事件的key code,然后driver将它发送到系统端的一个线程——被称为window server,而window server又会把它发向在window group中拥有焦点的那个应用程序中,这个步骤是使用一个control environment(CONE)来完成的,它是window server和user interface library之间的一个API函数。
这时到了应用程序端了,这里key events被OfferKeyEventL函数(由window server所调用)所处理,每次按下键都会产生三个不同的事件,第一个事件是EEventKeyDown,它是当一个键被按下后发生的,接着是EEventKey,我们通常对这个事件最感兴趣,最后是当按键松开后的EEventKeyUp,这些事件的类型都在TEventCode枚举类型中被指明,它也是传递到OfferKeyEventL中的第二个参数,第一个是一个结构,TKeyEvent,它提供了更多的关于本次事件的信息。
如果一个键被按下后持续超过0.8秒,那window server就会发送另一个EEventKey到该程序,这就是长按键事件(long key press event);如按键的时间超过了那个限度,则认为这是一次重复按键事件,window server会在每隔0.25秒就发送key repeat events。这些时间的间隔定义都是s60的缺省值,可以在程序中改变的。
TKeyEvent有一个成员变量,iRepeats,它可以用来分辨是长按键事件还是重复按键时间。总的来说,如果要分辨最后那一次按键事件的类型,可以查看iRepeats,如果为0,那就是长按键事件,如果不是就是重复按键事件。这里iRepeats是一个32位的带符号整数。因为大部分的按键事件都会及时处理,所以这个变量并没有定义实际重复按键的次数,如果想要知道有多少键被重复按下,应用程序就要自己来计算重复按键的次数了。
二、按键事件
OfferKeyEventL函数的第一个参数是TKeyEvent,它有四个成员:iCode,iScanCode,iModifiers,iRepeats。
模拟键盘按键需要创建一个时间,即TKeyEvent。
键盘码在e32keys.h中的EKeyCode中枚举。
三、模拟键盘按键的方法:
模拟键盘按键的方法有几种:TKeyEvent、TWsEvent、TApaTask、TRawEvent、SimulateRawEvent。这里只说明TKeyEvent的方法,多种方法请参考Nokia论坛:http://wiki.forum.nokia.com/index.php/Simulate_a_keypress
1. 数字和字母(例如“a”)
在EKeyCode没有定义数字和字母的键值,使用ASCII码即可。
SendSimulateKeyEvent( 'a' )或SendSimulateKeyEvent( '1' )
voidSendSimulateKeyEvent( TChar aChar )
{
RWsSession wsSession = CCoeEnv::Static()->WsSession();
TKeyEvent keyEvent;
keyEvent.iCode = aChar;
keyEvent.iScanCode = aChar;
keyEvent.iModifiers = 0;
keyEvent.iRepeats = 0;
wsSession.SimulateKeyEvent(keyEvent);
wsSession.Flush();
}
2. EKeyCode枚举的键值
以向上键为例。
keyEvent.iCode = EKeyUpArrow;
keyEvent.iScanCode = EStdKeyUpArrow;
keyEvent.iModifiers = 0;
keyEvent.iRepeats = 0;
wsSession.SimulateKeyEvent(keyEvent);
wsSession.Flush();
四、需要的library和capability
RWsSession需要的头文件和库是:
Location: W32STD.H
Link against: ws32.lib
SimulateKeyEvent这个API需要的Capability是SW Event,这个需要开发者证书,普通的自签名证书在Device上是不能运行的。