Symbian Security Studio

About symbian software programming ,security analysis and other things about symbian.

Monday, October 1, 2007

Symbian Programming - Capturing key presses in thread/exe - Mika Raento


If you want to change the behaviour of some keys on the phone, you can do this by capturing them in a thread (or exe), and handling them yourself. This is not hard, but figuring out all the steps needed takes a bit of effort.
The code below shows how a thread can capture some keys and react to them, optionally sending them to the top app if it's not interested in them itself. You'll only need a cleanup stack active for this thread, no active scheduler needed. // connect to window server
RWsSession ws;
User::LeaveIfError(ws.Connect());
CleanupClosePushL(ws);
TRequestStatus status;
// create a window group for the thread
RWindowGroup wg(ws);
wg.Construct((TUint32)&wg, EFalse);
CleanupClosePushL(wg);
// capture a key
User::LeaveIfError(wg.CaptureKey(EKeyLeftArrow, 0, 0));
// listen for the key presses
ws.EventReady(&status);
// hide this window group from the app switcher
wg.SetOrdinalPosition(-1);
wg.EnableReceiptOfFocus(EFalse);
CApaWindowGroupName* wn=CApaWindowGroupName::NewLC(ws);
wn->SetHidden(ETrue);
wn->SetWindowGroupName(wg);
// handle key events
for(;;) {
User::WaitForAnyRequest();
if (status.Int()==KErrNone) {
TWsEvent e;
ws.GetEvent(e);
TInt c;
TKeyEvent* aKeyEvent=e.Key();
c=aKeyEvent->iCode;
// do something with keypress
// if not ours, then send to top window group
// note that this breaks key repeat :-(
TInt wgid=ws.GetFocusWindowGroup();
ws.SendEventToWindowGroup(wgid, e);
}
ws.EventReady(&status);
// stop condition
}
// clean up
ws.EventReadyCancel();
CleanupStack::PopAndDestroy(3); //ws, wg, wn
The codes shows how to hide a window group as well. You'll need to add some means of detecting when the thread should finish.

Labels:

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home