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