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