1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/idle.h" 6 7 #include <limits.h> 8 #include <windows.h> 9 10 namespace { 11 12 DWORD CalculateIdleTimeInternal() { 13 LASTINPUTINFO last_input_info = {0}; 14 last_input_info.cbSize = sizeof(LASTINPUTINFO); 15 DWORD current_idle_time = 0; 16 if (::GetLastInputInfo(&last_input_info)) { 17 DWORD now = ::GetTickCount(); 18 if (now < last_input_info.dwTime) { 19 // GetTickCount() wraps around every 49.7 days -- assume it wrapped just 20 // once. 21 const DWORD kMaxDWORD = static_cast<DWORD>(-1); 22 DWORD time_before_wrap = kMaxDWORD - last_input_info.dwTime; 23 DWORD time_after_wrap = now; 24 // The sum is always smaller than kMaxDWORD. 25 current_idle_time = time_before_wrap + time_after_wrap; 26 } else { 27 current_idle_time = now - last_input_info.dwTime; 28 } 29 30 // Convert from ms to seconds. 31 current_idle_time /= 1000; 32 } 33 34 return current_idle_time; 35 } 36 37 bool IsScreensaverRunning() { 38 DWORD result = 0; 39 if (::SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &result, 0)) 40 return result != FALSE; 41 return false; 42 } 43 44 bool IsWorkstationLocked() { 45 bool is_locked = true; 46 HDESK input_desk = ::OpenInputDesktop(0, 0, GENERIC_READ); 47 if (input_desk) { 48 wchar_t name[256] = {0}; 49 DWORD needed = 0; 50 if (::GetUserObjectInformation(input_desk, 51 UOI_NAME, 52 name, 53 sizeof(name), 54 &needed)) { 55 is_locked = lstrcmpi(name, L"default") != 0; 56 } 57 ::CloseDesktop(input_desk); 58 } 59 return is_locked; 60 } 61 62 } // namespace 63 64 void CalculateIdleTime(IdleTimeCallback notify) { 65 notify.Run(static_cast<int>(CalculateIdleTimeInternal())); 66 } 67 68 bool CheckIdleStateIsLocked() { 69 return IsWorkstationLocked() || IsScreensaverRunning(); 70 } 71