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

S60 2nd 待机桌面状态检测 - 魔道之解决方法


  前一段时间做一个项目,要检测手机当前是否为桌面状态;然后在桌面显示一些东西。
  检测方法网上都有,如 http://discussion.forum.nokia.com/forum/showthread.php?t=130161 。但在第二版有一个问题,当在桌面状态时,按数字键播电话,这时会弹出输入框;这时就没有办法区分状态了;有新短信通知也一样。为解决这个问题花了好多时间,最后自己想了一个易做图的方法终于解决了这个问题。 如哪位有更正统的方法,请不吝赐教。

  实现方法:
  1. 程序第一次在桌面状态启动时,将桌面一小块区域截图(弹出对话框会覆盖的区域)并保存。
     CWsScreenDevice* screenDev = CCoeEnv::Static()->ScreenDevice();
    CFbsBitmap iScreenBitmap = new (ELeave) CFbsBitmap;
    if( KErrNone == iScreenBitmap->Create( TSize(dw, dh), screenDev->DisplayMode() ) )
screenDev->CopyScreenToBitmap( iScreenBitmap, TRect(0, sy, dw, sy+dh) );

  2. 增加一个任务对象;每次有激活事件触发时,再次获得桌面那一小块区域截图,和开始保存的进行检测,看是否一致。如果不一致就表示在桌面状态时有其它弹出框了。
     激活检测:
     void CActivityManager::Start()   
    {   
if (!IsActive())   
{   
iTimer.Inactivity(iStatus, 0);
SetActive(); 
}
    }   
    void CActivityManager::RunL()  
    {  
if (iStatus == KErrNone)  
{
             if 当前是桌面状态
               {
                 // 这里检测桌面新区域截图, 并比较。做相应处理
                    // ...
         Start();
             }
}
    }

    位图比较,只需要比较一行即可;相关函数:
    iScreenBitmap->GetScanLine( srcBuf->Des(), srcPos, dw, screenDev->DisplayMode() );
    newBitmap->GetScanLine( dstBuf->Des(), srcPos, dw, screenDev->DisplayMode() );  
    if( srcBuf->Compare( dstBuf->Des() ) == 0 )
return ETrue;
    else 
        return EFalse;


    以上是实现的主要思路;目前这个方法在几个手机上测试了都没有问题。

--------------------编程问答-------------------- 测试过更换主题吗? --------------------编程问答--------------------   没测试过,当时我想到这个方法时,也想到这个了;估计应该是肯定会导致上述方法失效。
  一,没有想到好的解决方法(如果捕获主题更换事件应该可以解决);二,因为这种情况很少,所以也就没处理了。
  如果楼上有处理好,请说说。 --------------------编程问答-------------------- 楼主是如何实现在桌面上显示一些东西的?我想写一个程序,在桌面上显示照相机拍的图片,装在自己的s60手机上,楼主能不能和我说一下怎么做。
万分感谢!
补充:移动开发 ,  Symbian
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,