在没有ui的程序中捕获所有的key事件
来源:互联网 发布:java 泛型调用 编辑:程序博客网 时间:2024/04/30 03:19
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* self = new (ELeave) CKeyCapturer2(aObserver);
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
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;
};
...{
CKeyCapturer2* self = CKeyCapturer2::NewLC(aObserver);
CleanupStack::Pop(self);
return self;
}
CKeyCapturer2* CKeyCapturer2::NewLC(MKeyCallBack& aObserver)
...{
CKeyCapturer2* self = new (ELeave) CKeyCapturer2(aObserver);
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
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;
};
- 在没有ui的程序中捕获所有的key事件
- 在控制台程序中捕获事件
- 在BindingSource组件的事件中捕获异常的注意事项
- 在MFC中捕获CWebBrowser控件的事件
- 在MFC中捕获CWebBrowser控件的事件
- 在MFC中捕获CWebBrowser控件的事件
- 捕获程序中未捕获的异常
- 在图形界面中实时捕获控制台程序的标准输出
- 捕获到应用程序中所有未捕获到的异常
- Android中由于没有捕获的异常导致程序意外停止
- Memcached中获取所有的key
- 在flash中捕获所有的报错 (Catch All Exception in Flash)
- 增加在ClassWizard中没有罗列事件的处理方法
- 关于wince 没有Key press事件的解决方法
- 捕获外部程序中TListView控件的鼠标右键点击事件
- 为何需要在发布的android程序中使用private key, 而不是debug key
- 事件的捕获
- 没有key的Json
- js 几种常用的表单输入判断
- xerces-c解析中文的简单方法
- 笑話
- “Microsoft Visual Studio远程调试监视器”绑定句柄无效问题的解决
- MP3音频录音机6.30版
- 在没有ui的程序中捕获所有的key事件
- 拷贝构造函数和赋值运算符 区别
- solaris下的weblogic技巧
- 序列化IDictionary 类型
- Solaris Xen Drop 66 - Release Notes
- 求助:page contentType="text/html;charset=gb2312"等价于什么?
- ASP.NET AJAX 简单介绍
- java abstract class 和 interface的概念分析与理解
- ASP.NET2.0中的登陆控件简介(1)