现在的位置: 首页 > 综合 > 正文

Qt Symbian: 如何让自己的程序显示在桌面上方

2013年04月05日 ⁄ 综合 ⁄ 共 3229字 ⁄ 字号 评论关闭

 

 

namespace
{
    const TUid KPSUidAiInformation = {0x101FD657};
    const TUint KActiveIdleUid = 0x00000001;     
    const TUid KIdleUidS60V5 = { 0x102750F0 };
    const TUid KGameAppUid = { 0xA000B649 };
}

MyApp::MyApp(int &argc, char **argv) : QApplication(argc,argv){
    phoneIdle();
}

 

TUid MyApp::idleId()
{
    /*
    TInt idleApp ( 0 );
    RProperty::Get( KPSUidAiInformation, KActiveIdleUid, idleApp );
    TUid idleAppUid = { idleApp  } ;
    return idleAppUid;
    */
   
   
    return KIdleUidS60V5;
}

void MyApp::phoneIdle()
{
    TApaTaskList taskList( CEikonEnv::Static()->WsSession() );
    TApaTask task = taskList.FindApp( idleId() );

    if( task.Exists() )  {
        task.BringToForeground();
    }
}

void MyApp::showApp()
{
    TApaTaskList taskList( CEikonEnv::Static()->WsSession() );
    TApaTask task = taskList.FindApp( KGameAppUid );

    if( task.Exists() )  {
        task.BringToForeground();
    }
}

 

bool GameApp::symbianEventFilter( const QSymbianEvent* event )
{
    const TWsEvent* pWsEvent = event->windowServerEvent(); 
   
    if ( NULL == pWsEvent ) {
        return false;
    }
   
    switch (pWsEvent->Type()) {
    default:
        break;
    case KAknUidValueEndKeyCloseEvent:
        return true;
    case EEventFocusGroupChanged:
        {
           
            if (mGameWidget) {
           
                TUid idleAppUid = idleId();
                // get focus application
                RWsSession& ws = CEikonEnv::Static()->WsSession();
                TInt wgid = ws.GetFocusWindowGroup();
                CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(ws, wgid);
                TUid focusAppId = gn->AppUid();
                CleanupStack::PopAndDestroy(gn);
                
                 if ( focusAppId == idleAppUid ){
                    CEikonEnv::Static()->RootWin().SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront);
                    (static_cast<CCoeControl*> (mWidget->winId()) )
                        ->DrawableWindow()->SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront);
                }
                else {
                    CEikonEnv::Static()->RootWin().SetOrdinalPosition(0,ECoeWinPriorityNormal);
                }                
            }
        }
        return true;
    }
   
    return false;
}

 

 

Reference:

 

*介绍
一些桌面软件会在用户把手机切换到桌面(desktop)时显示一些特定的信息,如图片,滚动文字等,达到一种个性桌面的效果,这里就介绍一种检测“桌面”的方法。

S60 2nd的“桌面”是电话应用,S60 3rd的“桌面”是Idle.exe,由此我们可以通过当前焦点程序的UID来判断手机是否处在“桌面”状态。

用户在操作手机时候会产生一些事件,其中有一个就是Focus Changed Event,所以我们只需获取这个事件通知,并在这个事件到来时获取焦点程序的UID进行比较就可以了。

*平台
S60 2nd,3rd

1、使自己的程序接收Focus Changed Event:[code]
void YourAppUi::ConstructL(void)
{
        // some code

        iEikonEnv->RootWin().EnableFocusChangeEvents();

        // some code
}
[/code]2、处理事件:[code]
void CDrawWindowTestAppUi::HandleWsEventL(const TWsEvent& aEvent,CCoeControl* aDestination)
{
        // const TUid KUidPhoneApp = { 0x100058b3 };  // for S60 2nd
        const TUid KUidIdleApp = { 0x101FD64C };      // for S60 3rd

        if ( aEvent.Type() == EEventFocusGroupChanged )
        {
                // 获取当前焦点程序的UID
                RWsSession& ws = iEikonEnv->WsSession();
                TInt wgid = ws.GetFocusWindowGroup();
                CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(ws, wgid);
                TUid aCurAppUid = gn->AppUid();
                CleanupStack::PopAndDestroy(gn);

                if ( aCurAppUid == KUidPhoneApp )
                {
                        // 当前为桌面
                }
                else
                {

                }
        }
       
        // 不要忘了这里^_^
        CAknAppUi::HandleWsEventL(aEvent, aDestination);
}

 

Source: http://www.devdiv.net/bbs/archiver/tid-6086.html 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.