当前位置:编程学习 > wap >>

求助:后台捕获按键的疑问

我想在待机界面的时候,按接听键弹出我自己的界面,但是只要按接听键,就进入“已拨电话”界面了,
因为我想在没有进入“已拨电话”界面之前就进入我的界面,因此我捕获了接听键的 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阻止按键事件被系统得到
阻止系统事件基本可以这样实现了

但是有一个例外
怎么阻止 按接听键打开“已拨电话”,也就是不让系统打开已拨电话这个界面,好像用这个方法不行 --------------------编程问答--------------------
引用 9 楼 actual_ 的回复:
可以用CaptureKey
CaptureKeyUpAndDowns阻止按键事件被系统得到
阻止系统事件基本可以这样实现了

但是有一个例外
怎么阻止 按接听键打开“已拨电话”,也就是不让系统打开已拨电话这个界面,好像用这个方法不行


阻止系统接收按键事件,那么就形成阻止系统事件! 
那为什么不能阻止 按接听键打开“已拨电话”

楼主遇到的问题能否描述详细些 --------------------编程问答-------------------- 楼上的,不好意思,我刚发现原因可能是我用FP2手机测试的事情

因为在FP1的模拟器上没问题了,点击接听键直接进入我的界面


但是在FP2 真机 上接听键还是先打开“已拨电话”,再进入我的界面

我加了SwEvent了没用

你有遇到这种情况吗? --------------------编程问答-------------------- http://www.forum.nokia.com/forum/showthread.php?p=636577



--------------------编程问答-------------------- 没有使用过FP2测试过。。。

有点诡异,既然有人实现过这个功能,再搜索下吧 --------------------编程问答-------------------- 有人遇见过吗?我还是解决不了…… --------------------编程问答-------------------- ??LZ现在解决了吗
补充:移动开发 ,  Symbian
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,