在没有ui的程序中捕获所有的key事件 Saturday, October 10, 2009

CKeyCapturer2演示了如何在那些没有实现标准程序框架的程序中捕获key事件。在实现了标准程序框架的程序中你可以通过调用OfferKeyEventL来捕捉.
原文: http://wiki.forum.nokia.com/index.php/Capturing_all_keys_in_Non-GUI_applications

CKeyCapturer2* CKeyCapturer2::NewL(MKeyCallBack& aObserver)
    
{
    CKeyCapturer2
* self = CKeyCapturer2::NewLC(aObserver);
    CleanupStack::Pop(self);
    
return self;
    }


CKeyCapturer2
* CKeyCapturer2::NewLC(MKeyCallBack& aObserver)
    
...


CKeyCapturer2::CKeyCapturer2(MKeyCallBack
& aObserver)
:CActive(EPriorityHigh),iObserver(aObserver)
{
 
}


CKeyCapturer2::
~CKeyCapturer2()
{
    Cancel();
    iWg.Close();
    iWsSession.Close();
}


void CKeyCapturer2::ConstructL()
{
    User::LeaveIfError(iWsSession.Connect());

    CActiveScheduler::Add(
this);

    iWg
=RWindowGroup(iWsSession);
    User::LeaveIfError(iWg.Construct((TUint32)
&iWg, EFalse));
 
    iWg.SetOrdinalPosition(
1, ECoeWinPriorityAlwaysAtFront+2);
    iWg.EnableReceiptOfFocus(ETrue);

    CApaWindowGroupName
* wn=CApaWindowGroupName::NewLC(iWsSession);
    wn
->SetHidden(EFalse);
    wn
->SetWindowGroupName(iWg);
    CleanupStack::PopAndDestroy();

    Listen();
}


void CKeyCapturer2::RunL()
{
    
if (iStatus == KErrNone)
    
{
        TWsEvent e;
        iWsSession.GetEvent(e);
        TInt type 
= e.Type();

        
switch (type)
        
{
        
case EEventKey: 
            
if(iObserver.KeyCapturedL(e))
            
{
                TInt wgId 
= iWsSession.GetFocusWindowGroup();
                iWsSession.SendEventToWindowGroup(wgId, e);
            }

            
break;
        
case EEventKeyUp:
        
case EEventKeyDown:
            
break;
        }
;
    }

 
    
if (iStatus != KErrCancel)
    
{
        Listen();
    }

}


void CKeyCapturer2::DoCancel()
{
    iWsSession.EventReadyCancel();
}



void CKeyCapturer2::Listen()
{
    iWsSession.EventReady(
&iStatus);
    SetActive();
}
[edit] CapturingKeys2.h
class MKeyCallBack
{
public:
    
virtual TBool KeyCapturedL(TWsEvent aEvent) = 0;
}
;



class CKeyCapturer2 : public CActive
{
public:
    
static CKeyCapturer2* NewL(MKeyCallBack& aObserver);
    
static CKeyCapturer2* NewLC(MKeyCallBack& aObserver);
    
virtual ~CKeyCapturer2();
private:
    CKeyCapturer2(MKeyCallBack
& aObserver);
    
void ConstructL();
    
void RunL();
    
void DoCancel();
    
void Listen();
private:
    MKeyCallBack
&     iObserver;
    RWsSession         iWsSession;
    RWindowGroup    iWg;
}
;

0 comments: