我们有时需要在后台运行软件捕捉用户手机的按键信息,一般可以作为安全软件,检查用户的输入,同样也可以作为黑客软件盗用用户的输入.
要实现该功能,有以下几个步骤
1.要求具有capability:SwEvent
2.头文件包括#include <apgwgnam.h>
增加成员变量
RWsSession iWsSession; // Window session.
RWindowGroup iWg; // Windows group.
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));
{
// 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();
}
// 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:
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;
}
break;
case EEventKeyDown: //向下按键
break;
}
TInt wgId = iWsSession.GetFocusWindowGroup();
iWsSession.SendEventToWindowGroup( wgId, e ); //注意要将捕获的事件转发给当前Focus窗口
iWsSession.SendEventToWindowGroup( wgId, e ); //注意要将捕获的事件转发给当前Focus窗口
iWsSession.EventReady(&iStatus);
SetActive(); //重新启动
}
6.对于捕获了按键后想进行其他处理的话,建议使用其他线程(活动对象)或定时器的方式,不要在捕获线程中直接处理,避免影响处理速度.