您的位置:首页 > 编程语言 > Qt开发

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

2010-11-09 09:37 417 查看
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:
void YourAppUi::ConstructL(void)
{
// some code

iEikonEnv->RootWin().EnableFocusChangeEvents();

// some 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: