求助:后台捕获按键的疑问
我想在待机界面的时候,按接听键弹出我自己的界面,但是只要按接听键,就进入“已拨电话”界面了,因为我想在没有进入“已拨电话”界面之前就进入我的界面,因此我捕获了接听键的 EEventKeyDown ,然后进入我的界面。
这样是可以进入了,但是是从“待机界面”->“已拨电话”界面->我自己的界面,这样“已拨电话”界面闪了一下,而且通话记录也被打开了。
我想请教一下各位:如何不打开通话记录就进入我的界面?
谢谢! --------------------编程问答-------------------- 捕获EEventKey事件试试,提高后台捕获的优先级,同时不要把捕获到的事件继续传递给其他窗口。
(一般系统程序响应的是EEventKey事件,而不是EEventKeyDown/EEventKeyUp) --------------------编程问答-------------------- 谢谢你的回复!
麻烦你再看看我的代码:
ConstructL:
iEikonEnv->RootWin().CaptureKeyUpAndDowns(EStdKeyYes, 0, 0, 1073741824);
iEikonEnv->RootWin().CaptureKey(EStdKeyYes, 0, 1073741824);
HandleKeyEventL:
if (aKeyEvent.iScanCode == EStdKeyYes)
{
TVwsViewId GridView(KAppUid, KViewid);
((CAknViewAppUi*) CCoeEnv::Static()->AppUi())->ActivateViewL(GridView);
return EKeyWasConsumed;
}
--------------------编程问答-------------------- 是不是 通话记录 的优先级比我的程序的优先级高,我怎们拦截都会它先处理才轮到我的程序啊? --------------------编程问答-------------------- 在待机界面的时候,按 挂机键 就会进入通话记录。
此时只产生EEventKeyDown和EEventKeyUp 事件
据说可以利用CWindowAnim的OfferRawEvent搞定
正在尝试……
--------------------编程问答-------------------- 待机事件就是系统将当前窗口组转到后台,运行系统的待机程序,将待机窗口组切换到前台的过程,因此,要想捕获待机事件就要通过窗口服务器捕获窗口组切换事件,从中过滤出待机程序窗口组。在Symbian中窗口服务器RWsSession类中提供了异步的API:EventReady()来通知应用程序一般窗口组事件, Redraw和Priority key事件除外。
在程序中,可以在后台实现一个AO来处理捕获窗口组事件,以下为一个简单的监听窗口组事件的类CListener和接口MForeObserver:
class MForeObserver
{
public:
virtual void ForegroundEventL(TUid aAppUid) = 0;
};
class CListener: public CActive
{
public:
CListener ();
~CListener ();
void ConstructL(MForegroundObserver& aObserver);
private:
void RunL();
void DoCancel();
void Listen();
private:
//窗口切换观察者
MForeObserver* iObserver;
//窗口服务器
RWsSession iWsSession;
//窗口组
RWindowGroup iWdGroup;
};
下面是具体实现:
void CListener::ConstructL(MForeObserver& aObserver)
{
iObserver = &aObserver;
//窗口服务器必须调用Connect()建立连接,完成初始化
iWsSession.Connect();
//窗口服务器创建后初始化对应的窗口组
iWdGroup = RWindowGroup(iWsSession);
User::LeaveIfError(iWdGroup.Construct((TUint32)&iWdGroup, EFalse));
iWdGroup.SetOrdinalPosition(-1);
iWdGroup.EnableReceiptOfFocus(EFalse);
//将该窗口组隐藏
CApaWindowGroupName* windowGroupName = CApaWindowGroupName::NewLC(iWsSession);
windowGroupName->SetHidden(ETrue);
windowGroupName->SetWindowGroupName(iWdGroup);
CleanupStack::PopAndDestroy(windowGroupName);
//使该窗口组可以响应程序焦点改变事件
User::LeaveIfError(iWdGroup.EnableFocusChangeEvents());
//开始监听
Listen();
}
void CListener::Listen()
{
//开始监听窗口组事件
iWsSession.EventReady(&iStatus);
SetActive();
}
void CListener::RunL()
{
if (KErrNone == iStatus.Int())
{
// iWsSession不能连续两次调用EventReady(),GetEvent()必须在成功捕获到窗口组事件后调用
TWsEvent wsEvent;
iWsSession.GetEvent(wsEvent);
}
//获取当前在前台的窗口组句柄
TInt currWindowHandle = iWsSession.GetFocusWindowGroup();
// 通过窗口组句柄获得窗口组名
CApaWindowGroupName* groupName = CApaWindowGroupName::NewLC(iWsSession, currWindowHandle);
//获取当前窗口组所属应用程序ID,回调给观察者
iObserver->ForegroundEventL(groupName->AppUid());
CleanupStack::PopAndDestroy();
//如果没有取消,继续监听
if (KErrCancel != iStatus.Int())
{
Listen();
}
}
void CListener::DoCancel()
{
//取消事件通知
iWsSession.EventReadyCancel();
}
CListener类可以捕获应用程序打开、关闭、前后台切换等事件,Symbian 3rd中,待机程序ID为0x100056CF,从而可以通过比较回调的应用程序ID来捕获待机事件:
const TUid KUidStandBy = {0x100056CF};
void ForegroundEventL(TUid aAppUid)
{
if (KUidStandBy == aAppUid)
{
//待机时打开google网站
const TInt KBrowserUid = 0x10008D39;
TUid id( TUid::Uid( KBrowserUid ) );
TApaTaskList taskList(CEikonEnv::Static()->WsSession() ) ;
TApaTask task = taskList.FindApp( id ) ;
RApaLsSession appArcSession;
TThreadId thread_id = 0;
HBufC * param = NULL;
param = HBufC::NewLC(50);
param->Des().Copy( _L( "4 www.google.com.cn" ) );
(void)User::LeaveIfError(appArcSession.Connect());
(void)appArcSession.StartDocument( *param, TUid::Uid( KBrowserUid ), thread_id );
appArcSession.Close();
CleanupStack::PopAndDestroy();
}
}
--------------------编程问答-------------------- 呵呵,ls的把系统窗口事件的监听和机制说的很清楚了,不错.
不过这不能解决lz的问题,两码事 --------------------编程问答-------------------- 有人用过使用动画DLL捕获按键事件来实现拦截按键吗? --------------------编程问答-------------------- 怎么能阻止一个按键事件被系统得到呢?
--------------------编程问答-------------------- 可以用CaptureKey
CaptureKeyUpAndDowns阻止按键事件被系统得到
阻止系统事件基本可以这样实现了
但是有一个例外
怎么阻止 按接听键打开“已拨电话”,也就是不让系统打开已拨电话这个界面,好像用这个方法不行 --------------------编程问答--------------------
阻止系统接收按键事件,那么就形成阻止系统事件!
那为什么不能阻止 按接听键打开“已拨电话”
楼主遇到的问题能否描述详细些 --------------------编程问答-------------------- 楼上的,不好意思,我刚发现原因可能是我用FP2手机测试的事情
因为在FP1的模拟器上没问题了,点击接听键直接进入我的界面
但是在FP2 真机 上接听键还是先打开“已拨电话”,再进入我的界面
我加了SwEvent了没用
你有遇到这种情况吗? --------------------编程问答-------------------- http://www.forum.nokia.com/forum/showthread.php?p=636577
--------------------编程问答-------------------- 没有使用过FP2测试过。。。
有点诡异,既然有人实现过这个功能,再搜索下吧 --------------------编程问答-------------------- 有人遇见过吗?我还是解决不了…… --------------------编程问答-------------------- ??LZ现在解决了吗
补充:移动开发 , Symbian