程序运行时,有时候会碰到一些意外的事件,比如来电、短信、低电量提示、USB模式接入等,因此程序需要对这些事件进行及时处理,否则会影响手机的正常使用,以下是我一般处理这些事件的简单做法,也不一定最好的,大家可以讨论一下。
1、USB的接入:
一些程序运行中需要对文件进行读写,如果这时候以U盘模式接入了计算机,那么会导致程序无法正常读写文件甚至出出错。
解决办法一:
注册一个USB事件,当USB的状态发生变化时,系统会向应用程序的主窗口广播一个通知消息。
- INT g_iUsbNotifyMsg = 0;
- BOOL CTestWin::OnInitDialog()
- {
- g_iUsbNotifyMsg = RegisterUsbNotifyMsg();
- ......
- }
- ......
- LRESULT CTestWin::MzDefWndProc(UINT message, WPARAM wParam, LPARAM lParam)
- {
- if(message == g_iUsbNotifyMsg)
- {
- INT iEvenType = (INT)wParam;
- if(USB_MASSSTORAGE_ATTACH==iEvenType)
- {
- MzMessageBoxEx(NULL,L"程序无法工作在U盘模式,请断开USB连接再运行本程序!",NULL,MB_OK,false);
- PostQuitMessage(0);
- }
- ......
- }
- // 其他消息处理
- ......
- }
解决办法二:
在需要读写文件等操作的地方调用GetUsbConnectType()来查询USB的状态,这样可以避免读写错误 而又无需退出程序。
例如如果需要切换皮肤,在切换前可以先做个判断:
- if (GetUsbConnectType()==USB_MASSSTORAGE_ATTACH)//U盘模式
- {
- MzMessageBoxEx(m_hWnd,L"U盘模式无法切换皮肤!",NULL,MB_OK,false);
- }
- else
- {
- ChangeSkin();
- }
2、来电与短信等弹出窗口的处理
有的软件 需要旋屏、隐藏工具栏、设置顶层窗口等操作,在来电或短信时需要恢复正常的操作界面,否则会造成错屏或无法操作。那么就需要用到以下消息:
- DWORD m_dwCallMsg;
- DWORD m_dwSmsMsg;
- BOOL CTestWin::OnInitDialog()
- {
- m_dwCallMsg = GetCallRegisterMessage();
- m_dwSmsMsg = GetSmsRegisterMessage();
- }
- LRESULT CTestWin::MzDefWndProc(UINT message, WPARAM wParam, LPARAM lParam)
- {
- if (message == m_dwCallMsg || message == m_dwSmsMsg)
- {
- if (wParam == CALL_BEGIN)
- {//检测到有电话或短信入,这时需要恢复正常屏幕,显示状态栏,并让出顶层窗口
- }
- else if (wParam == CALL_END)
- {//电话或短信窗口关闭,恢复程序的运行状态
- }
- }
- }
还可以结合WM_ACTIVATE消息进行处理:
- LRESULT CTestWin::MzDefWndProc(UINT message, WPARAM wParam, LPARAM lParam)
- {//假设本程序需要隐藏状态栏
- switch(message)
- {
- case WM_ACTIVATE:
- {
- switch (wParam)
- {
- case WA_INACTIVE:
- {
- ShowMzTopBar();//恢复状态栏显示
- }
- break;
- case WA_ACTIVE:
- {
- HideMzTopBar();//隐藏状态栏
- }
- break;
- }
- }
- break;
- }
- return CMzWndEx::MzDefWndProc(message,wParam,lParam);
- }