Advertisement
Guest User

Untitled

a guest
Sep 30th, 2015
588
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "shutdown.h"
  3.  
  4.  
  5. const BYTE PowerMode = 0xD6;
  6. const DWORD PowerOn = 0x01;
  7. const DWORD PowerOff = 0x04;
  8.  
  9.  
  10. struct MonitorDesc
  11. {
  12.     HANDLE hdl;
  13.     RECT rc;
  14.     DWORD lastTick;
  15.     DWORD power;
  16. };
  17.  
  18.  
  19. BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
  20. {
  21.     std::vector<MonitorDesc>* pMonitors = reinterpret_cast< std::vector<MonitorDesc>* >(dwData);
  22.    
  23.     DWORD nMonitorCount;
  24.     if(GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, &nMonitorCount))
  25.     {
  26.         PHYSICAL_MONITOR* pMons = new PHYSICAL_MONITOR[nMonitorCount];
  27.  
  28.         if(GetPhysicalMonitorsFromHMONITOR(hMonitor, nMonitorCount, pMons))
  29.         {
  30.             for(DWORD i=0; i<nMonitorCount; i++)
  31.             {
  32.                 MonitorDesc desc;
  33.                 desc.hdl = pMons[i].hPhysicalMonitor;
  34.                 desc.rc = *lprcMonitor;
  35.  
  36.                 pMonitors->push_back(desc);
  37.             }
  38.         }
  39.         delete[] pMons;
  40.     }
  41.  
  42.     return TRUE;
  43. }
  44.  
  45.  
  46.  
  47.  
  48. void MonitorSwitch(MonitorDesc& monitor, DWORD mode)
  49. {
  50.     if(monitor.power == mode)
  51.         return;
  52.  
  53.     SetVCPFeature(monitor.hdl, PowerMode, mode);
  54.     monitor.power = mode;
  55. }
  56.  
  57.  
  58.  
  59.  
  60. int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
  61. {
  62.     DWORD IdleTime = 10 * 60 * 1000;
  63.  
  64.     std::vector<MonitorDesc> monitors;
  65.     EnumDisplayMonitors(NULL, NULL, &MonitorEnumProc, reinterpret_cast<LPARAM>(&monitors));
  66.  
  67.  
  68.     DWORD tick = GetTickCount();
  69.  
  70.     for(auto& monitor : monitors)
  71.     {
  72.         monitor.power = PowerOn;
  73.         monitor.lastTick = tick;
  74.     }
  75.  
  76.     POINT lastPos;
  77.     GetCursorPos(&lastPos);
  78.  
  79.     while(1)
  80.     {
  81.         DWORD tick = GetTickCount();
  82.  
  83.         POINT pt;
  84.         GetCursorPos(&pt);
  85.  
  86.         bool move = false;
  87.         if(pt.x != lastPos.x || pt.y != lastPos.y)
  88.         {
  89.             move = true;
  90.         }
  91.  
  92.         lastPos = pt;
  93.  
  94.         if(move)
  95.         {
  96.             for(auto& monitor : monitors)
  97.             {
  98.                 if(pt.x >= monitor.rc.left && pt.x < monitor.rc.right && pt.y >= monitor.rc.top && pt.y < monitor.rc.bottom)
  99.                 {
  100.                     monitor.lastTick = tick;
  101.                     break;
  102.                 }
  103.             }
  104.         }
  105.  
  106.         for(auto& monitor : monitors)
  107.         {
  108.             DWORD delta = (tick - monitor.lastTick);
  109.             if(delta >= IdleTime)
  110.             {
  111.                 // wyłącz ekran
  112.                 if(monitor.power == PowerOn)
  113.                 {
  114.                     MonitorSwitch(monitor, PowerOff);
  115.                 }
  116.             }
  117.             else
  118.             {
  119.                 // włącz ekran
  120.                 if(monitor.power == PowerOff)
  121.                 {
  122.                     MonitorSwitch(monitor, PowerOn);
  123.                 }
  124.             }
  125.         }
  126.  
  127.         Sleep(50);
  128.     }
  129.  
  130.  
  131.     return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement