s60 3rd如何实现后台捕捉按键

我们有时需要在后台运行软件捕捉用户手机的按键信息,一般可以作为安全软件,检查用户的输入,同样也可以作为黑客软件盗用用户的输入.
要实现该功能,有以下几个步骤
1.要求具有capability:SwEvent
2.头文件包括#include <apgwgnam.h>
增加成员变量
 RWsSession    iWsSession; // Window session.
 RWindowGroup  iWg;    // Windows group.
3.处理类为继承CActive
4.在类的ContructL函数
void ConstructL()
{
 // create session.
 User::LeaveIfError(iWsSession.Connect());
 // create window group.
 iWg = RWindowGroup(iWsSession);
 User::LeaveIfError(iWg.Construct((TUint32)&iWg, EFalse));//EFalse 不接收键盘Focus
 // Enable app to recive event.
 iWg.SetOrdinalPosition(-1, ECoeWinPriorityNormal+2 );//设置窗口的顺序和优先级,-1表示最上面
 iWg.EnableReceiptOfFocus(EFalse); //该窗口不接受键盘Focus
 // window group
 CApaWindowGroupName* wn = CApaWindowGroupName::NewLC(iWsSession); //创建窗口组名
 wn->SetHidden(ETrue); //隐藏名字
 wn->SetWindowGroupName(iWg); //与窗口组绑定
 CleanupStack::PopAndDestroy();
 // set key to capture.
 User::LeaveIfError(iWg.CaptureKey(EKeyCaptureNum0, 0,0));
//EKeyCaptureNum0==0x30 ,数字0,设置要求Windows Server无论哪个窗口按0键按下都要通知,后面0,0可以作为要求同时按Ctrl或Alt按键.
//如果需要捕获其他按键的话,只要添加相关的语句就可以
 // start it.  启动线程捕获事件
 if (!IsActive()) {
 iWsSession.EventReady(&iStatus);
 SetActive();
 }
}
5.类函数RunL中
void RunL()
{
  TWsEvent e;
  iWsSession.GetEvent(e);
  // Get event type.
  TInt type = e.Type();
  // check event type.
  switch (type)
  {
  case EEventKey:
      switch(code)
        {
                case EKeyCaptureNum0:
                         break;    //数字0 
        }
  case EEventKeyUp:    //向上按键
   break;
  case EEventKeyDown: //向下按键
   break;
 }
  TInt wgId = iWsSession.GetFocusWindowGroup();
  iWsSession.SendEventToWindowGroup( wgId, e );  //注意要将捕获的事件转发给当前Focus窗口
 iWsSession.EventReady(&iStatus);
  SetActive();   //重新启动
}
6.对于捕获了按键后想进行其他处理的话,建议使用其他线程(活动对象)或定时器的方式,不要在捕获线程中直接处理,避免影响处理速度.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值