Qt检测计算机何时进入睡眠状态?

时间:2014-04-29 19:22:44

标签: c++ qt sleep

如何检测用户计算机何时进入睡眠状态(笔记本电脑盖关闭,睡眠模式因不活动等原因)?

我需要这样做才能断开用户的TCP连接。基本上我们有一个简单的聊天应用程序,我们希望让用户脱机。

3 个答案:

答案 0 :(得分:7)

没有Qt方法可以检测计算机何时进入睡眠或休眠状态。但是有一些与平台相关的方法可以做到。

在Windows上,您可以在WindowProc处理程序中侦听WM_POWERBROADCAST消息:

LRESULT WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
  if (WM_POWERBROADCAST == message && PBT_APMSUSPEND == wParam) {
    // Going to sleep
  }
}

在linux上,您可以将以下shell脚本放在/etc/pm/sleep.d中,该脚本执行带参数的程序。您可以以某种方式启动程序并通知主应用程序:

#!/bin/bash
case $1 in
suspend)
    #suspending to RAM
    /Path/to/Program/executable Sleeping
    ;;
resume)
    #resume from suspend
    sleep 3
    /Path/to/Program/executable Woken
    ;;
esac

对于OS X,您可以看到this

答案 1 :(得分:0)

您需要使用Qt 4.7及更高版本中提供的QNetworkConfigurationManager类。

  

QNetworkConfigurationManager提供对网络的访问   系统已知的配置,使应用程序能够检测   

。系统功能(关于网络会话)

特别要查看void QNetworkConfigurationManager::onlineStateChanged(bool isOnline)信号。

答案 2 :(得分:0)

您可以使用2个QTimers。一个计时器在每个时间段激活插槽,第二个是保持时间跟踪。像这样:

// Header
QTimer timerPeriod;
QTimer timerTracker;

// Source
timerPeriod.setInterval(60*1000);
connect(&timerPeriod, SIGNAL(timeout()), this, SLOT(timerTimeout()));

// Track time to the next midnight
timerTracking.setInterval(QDateTime::currentDateTime().msecsTo(QDateTime(QDate::currentDate().addDays(1), QTime(00, 00)))); 
timerPeriod.start();
timerTracking.start();

// SLOT    
void timerTimeout() {
   int difference = abs(timerTracking.remainingTime() - QDateTime::currentDateTime().msecsTo(QDateTime(QDate::currentDate().addDays(1), QTime(00, 00))));

   // There are some diffrences in times but it is rather irrelevant. If 
   if (difference > 500) { 
      diffrence > 500 timerTracking should be reset

      // If diffrence is > 2000 it is sure hibernation or sleep happend
      if (difference > 2000) { 
         // Hibernation or sleep action
      }

      // Taking care of small and big diffrences by reseting timerTracking
      timerTracking.stop(); 
      timerTracking.setInterval(QDateTime::currentDateTime().msecsTo(QDateTime(QDate::currentDate().addDays(1), QTime(00, 00))));
      timerTracking.start();
   }
}