重要的经典的贴子:关于M8程序时运行中一些意外事件的处理

来源:互联网 发布:网络安全产品对比 编辑:程序博客网 时间:2024/05/15 23:49

程序运行时,有时候会碰到一些意外的事件,比如来电、短信、低电量提示、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. }
复制代码