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

C++ Qt检测计算机何时进入睡眠状态?,c++,qt,sleep,C++,Qt,Sleep,如何检测用户的计算机何时进入睡眠状态(笔记本电脑盖关闭、由于不活动而进入睡眠模式等) 我需要这样做来断开用户的TCP连接。基本上,我们得到了一个简单的聊天应用程序,可以让用户离线。您需要使用Qt 4.7及更高版本中提供的类 QNetworkConfigurationManager提供对网络的访问 系统已知的配置,使应用程序能够检测 运行时的系统功能(关于网络会话) 特别是看信号。没有办法检测计算机何时进入睡眠或休眠状态。但有一些依赖于平台的方法可以做到这一点 在Windows上,您可以在Wind

如何检测用户的计算机何时进入睡眠状态(笔记本电脑盖关闭、由于不活动而进入睡眠模式等)

我需要这样做来断开用户的TCP连接。基本上,我们得到了一个简单的聊天应用程序,可以让用户离线。

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

QNetworkConfigurationManager提供对网络的访问 系统已知的配置,使应用程序能够检测 运行时的系统功能(关于网络会话)


特别是看信号。

没有办法检测计算机何时进入睡眠或休眠状态。但有一些依赖于平台的方法可以做到这一点

在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

对于OSX,您可以看到。

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

// 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();
   }
}

我的猜测是,这将取决于平台-您需要在什么操作系统上检测此问题?我需要在OS X和Windows上检测此问题。请看,我在Mac上尝试了此方法,将Mac置于睡眠状态不会导致发出onlineStateChanged(bool)信号。QNetworkConfigurationManager文档中没有任何内容建议应该发出它,因为该类处理网络配置,而不是睡眠/唤醒事件。