迷你5207专属论坛

注册

 

发新话题 回复该主题

[魅族M8] 重要的经典的贴子:关于M8程序时运行中一些意外事件的处理 [复制链接]

发表者
程序运行时,有时候会碰到一些意外的事件,比如来电、短信、低电量提示、USB模式接入等,因此程序需要对这些事件进行及时处理,否则会影响手机的正常使用,以下是我一般处理这些事件的简单做法,也不一定最好的,大家可以讨论一下。

1、USB的接入:
一些程序运行中需要对文件进行读写,如果这时候以U盘模式接入了计算机,那么会导致程序无法正常读写文件甚至出出错。
解决办法一:
注册一个USB事件,当USB的状态发生变化时,系统会向应用程序的主窗口广播一个通知消息。
  1. INT g_iUsbNotifyMsg = 0;



  2. BOOL CTestWin::OnInitDialog()
  3. {
  4.      g_iUsbNotifyMsg = RegisterUsbNotifyMsg();
  5.      ......
  6. }
  7. ......


  8. LRESULT CTestWin::MzDefWndProc(UINT message, WPARAM wParam, LPARAM lParam)
  9. {
  10.   if(message == g_iUsbNotifyMsg)
  11.   {
  12.     INT iEvenType = (INT)wParam;
  13.     if(USB_MASSSTORAGE_ATTACH==iEvenType)
  14.     {
  15.         MzMessageBoxEx(NULL,L"程序无法工作在U盘模式,请断开USB连接再运行本程序!",NULL,MB_OK,false);
  16.         PostQuitMessage(0);
  17.     }
  18.      ......
  19. }

  20.   // 其他消息处理
  21.   ......
  22. }
复制代码
解决办法二:
在需要读写文件等操作的地方调用GetUsbConnectType()来查询USB的状态,这样可以避免读写错误而又无需退出程序。

例如如果需要切换皮肤,在切换前可以先做个判断:
  1. if (GetUsbConnectType()==USB_MASSSTORAGE_ATTACH)//U盘模式
  2. {
  3.     MzMessageBoxEx(m_hWnd,L"U盘模式无法切换皮肤!",NULL,MB_OK,false);
  4. }
  5. else
  6. {
  7.      ChangeSkin();
  8. }
复制代码
2、来电与短信等弹出窗口的处理
有的软件需要旋屏、隐藏工具栏、设置顶层窗口等操作,在来电或短信时需要恢复正常的操作界面,否则会造成错屏或无法操作。那么就需要用到以下消息:
  1. DWORD m_dwCallMsg;
  2. DWORD m_dwSmsMsg;

  3. BOOL CTestWin::OnInitDialog()
  4. {
  5.     m_dwCallMsg = GetCallRegisterMessage();
  6.     m_dwSmsMsg = GetSmsRegisterMessage();
  7. }


  8. LRESULT CTestWin::MzDefWndProc(UINT message, WPARAM wParam, LPARAM lParam)
  9. {
  10.         if (message == m_dwCallMsg || message == m_dwSmsMsg)
  11.         {
  12.                 if (wParam == CALL_BEGIN)
  13.                 {//检测到有电话或短信入,这时需要恢复正常屏幕,显示状态栏,并让出顶层窗口
  14.                 }
  15.                 else if (wParam == CALL_END)
  16.                 {//电话或短信窗口关闭,恢复程序的运行状态
  17.                 }
  18.         }
  19. }
复制代码
还可以结合WM_ACTIVATE消息进行处理:
  1. LRESULT CTestWin::MzDefWndProc(UINT message, WPARAM wParam, LPARAM lParam)
  2. {//假设本程序需要隐藏状态栏
  3.         switch(message)
  4.         {
  5.         case WM_ACTIVATE:
  6.                 {
  7.                         switch (wParam)
  8.                         {
  9.                         case WA_INACTIVE:
  10.                                 {
  11.                                         ShowMzTopBar();//恢复状态栏显示
  12.                                 }
  13.                                 break;

  14.                         case WA_ACTIVE:
  15.                                 {
  16.                                         HideMzTopBar();//隐藏状态栏
  17.                                 }

  18.                                 break;
  19.                         }
  20.                 }

  21.                 break;
  22.         }

  23.         return CMzWndEx::MzDefWndProc(message,wParam,lParam);
  24. }
复制代码
本主题由 皇帝 5207 于 2010-12-27 22:53:31 执行 设置高亮 操作
分享 转发
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
沙发

楼主你试验过 “2、来电与短信等弹出窗口的处理”
这段代码没有?

我可是根本拦截不到这些系统消息的,后来我将所有系统消息全部记录下来,才分析出了真正的系统消息值。
哦,不过我是在新UI固件下做的。可能旧UI有效?
最后编辑IfI 最后编辑于 2010-01-04 11:51:39
TOP
凳子

原帖由 IfI 于 2010-1-4 11:36:00 发表
楼主你试验过 “2、来电与短信等弹出窗口的处理”
这段代码没有?

我可是根本拦截不到这些系统消息的,后来我将所有系统消息全部记录下来,才分析出了真正的系统消息值。
哦,不过我是在新UI固件下做的。可能旧UI有效?


试验过。发布过的正式版本固件测试都没有问题。
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
发新话题 回复该主题