Up to: Mika Raento's Symbian Programming pages
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 method below does work on 3rd edition but has the limitation that numeric keys are not captured since the phone application is already getting them in its own way. To get (almost) all keys you can use an animation dll instead.
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.
Mika Raento, mikie(at)iki.fi