PPC待机开机后网络连接会断开,必须重新激活网络,通常是怎样处理这个过程的呢?
激活网络->建立socket->工作->手机因某原因待机->网络断开->激活开机->怎样处理返回到第一步呢?
------解决方案--------------------
待机重新唤醒问题,一直都是WM比较棘手的问题之一呀~~~~
帮顶了。
我以前的做法是用定时器监视电池状态(GetSystemPowerState),不过效果不理想
------解决方案--------------------
系统唤醒当然会发消息,你要做的就是创建一个消息队列,然后等着系统发给你
- C/C++ code
DWORD ResumeMonThread(LPVOID){ MSGQUEUEOPTIONS msgOptions = {0}; while(!IsAPIReady(SH_SHELL) || !IsAPIReady(SH_WMGR) || !IsAPIReady(SH_GDI)) { Sleep(250); } wprintf(_T("ResumeMonThread TID = 0x%x\r\n"), GetCurrentThreadId()); // Create a message queue for Power Manager notifications. msgOptions.dwSize = sizeof(MSGQUEUEOPTIONS); msgOptions.dwFlags = 0; msgOptions.dwMaxMessages = 0; msgOptions.cbMaxMessage = sizeof(POWER_BROADCAST) + MAX_NAMELEN; msgOptions.bReadAccess = TRUE; g_hPMReadMsgQ = CreateMsgQueue(NULL, &msgOptions); if ( g_hPMReadMsgQ == NULL ) { DEBUGMSG(1, (TEXT("PWM: CreateMsgQueue(Read): error %d\r\n"), GetLastError())); g_FlagExitThrd = TRUE; } // Request Power notifications g_hPMNotifications = RequestPowerNotifications(g_hPMReadMsgQ, POWER_NOTIFY_ALL); if ( ! g_hPMNotifications ) { DEBUGMSG(1, (TEXT("PWM: RequestPowerNotifications: error %d\r\n"), GetLastError())); g_FlagExitThrd = TRUE; } DebugOut(TEXT("ResumeMonThread: create thread success!!!")); while(!g_FlagExitThrd) { DWORD iBytesInQueue = 0; DWORD dwFlags; UCHAR buf[QUEUE_SIZE]; PPOWER_BROADCAST pB = (PPOWER_BROADCAST) buf; memset(buf, 0, QUEUE_SIZE); DEBUGMSG(0, (TEXT("PWM: Waiting for PM state transition notification\r\n"))); // Read message from queue. if ( ! ReadMsgQueue(g_hPMReadMsgQ, buf, QUEUE_SIZE, &iBytesInQueue, INFINITE, &dwFlags) ) { DEBUGMSG(1, (TEXT("PWM: ReadMsgQueue: ERROR:%d\r\n"), GetLastError())); } else if ( iBytesInQueue < sizeof(POWER_BROADCAST) ) { DEBUGMSG(1, (TEXT("PWM: Received short message: %d bytes, expected: %d\r\n"), iBytesInQueue, sizeof(POWER_BROADCAST))); } else { switch ( pB->Message ) { case PBT_TRANSITION: //RETAILMSG(1, (TEXT("PWM: PBT_TRANSITION to system power state [Flags: 0x%x]: '%s'\r\n"), pB->Flags, pB->SystemPowerState)); switch ( POWER_STATE(pB->Flags) ) { case POWER_STATE_ON: //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_ON\r\n"))); break; case POWER_STATE_OFF: //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_OFF\r\n"))); break; case POWER_STATE_CRITICAL: //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_CRITICAL\r\n"))); break; case POWER_STATE_BOOT: //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_BOOT\r\n"))); break; case POWER_STATE_IDLE: //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_IDLE\r\n"))); break; case POWER_STATE_SUSPEND: DebugOut(TEXT("POWER_STATE_SUSPEND for resume mon\r\n")); break; case POWER_STATE_RESET: //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_RESET\r\n"))); break; case POWER_STATE_PASSWORD: //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_PASSWORD\r\n"))); break; case POWER_STATE_UNATTENDED: //DEBUGMSG(1, (TEXT("PWM: POWER_STATE_UNATTENDED\r\n"))); break; case 0: //DEBUGMSG(1,(TEXT("PWM: Power State Flags:0x%x\r\n"),pB->Flags)); break; default: //DEBUGMSG(1,(TEXT("PWM: Unknown Power State Flags:0x%x\r\n"),pB->Flags)); break; } break; case PBT_RESUME: { DebugOut(TEXT("PBT_RESUME\r\n")); if(g_hMainWnd != NULL) { ShowWindow(g_hMainWnd, SW_SHOWNORMAL); SetForegroundWindow((HWND)((ULONG) g_hMainWnd | 0x00000001)); SendMessage(g_hMainWnd, WM_REFRESH_TIME, 0, 0); } break; } case PBT_POWERSTATUSCHANGE: //DebugOut(TEXT("PWM: PBT_POWERSTATUSCHANGE\r\n")); break; case PBT_POWERINFOCHANGE: { PPOWER_BROADCAST_POWER_INFO ppbpi = (PPOWER_BROADCAST_POWER_INFO) pB->SystemPowerState; // RETAILMSG(1, (TEXT("PWM: PBT_POWERINFOCHANGE\r\n"))); // RETAILMSG(1, (TEXT("PWM: \tAC line status %u, battery flag %u, backup flag %u, %d levels\r\n"), // ppbpi->bACLineStatus, ppbpi->bBatteryFlag, // ppbpi->bBackupBatteryFlag, ppbpi->dwNumLevels)); break; } default: //DEBUGMSG(1, (TEXT("PWM: Unknown Message:%d\r\n"), pB->Message)); break; } } } // We shouldn't be here if ( g_hPMNotifications ) { StopPowerNotifications(g_hPMNotifications); g_hPMNotifications = NULL; } if ( g_hPMReadMsgQ ) { CloseMsgQueue(g_hPMReadMsgQ); g_hPMReadMsgQ = NULL; } DebugOut(_T("ResumeMonThread Exit\r\n")); return 0;}VOID ReleasePMThread(VOID){ g_FlagExitThrd = TRUE; if ( g_hPMNotifications ) { StopPowerNotifications(g_hPMNotifications); g_hPMNotifications = NULL; } if ( g_hPMReadMsgQ ) { CloseMsgQueue(g_hPMReadMsgQ); g_hPMReadMsgQ = NULL; } return;}