如何检测用户计算机何时进入睡眠状态(笔记本电脑盖关闭,睡眠模式因不活动等原因)?
我需要这样做才能断开用户的TCP连接。基本上我们有一个简单的聊天应用程序,我们希望让用户脱机。
答案 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();
}
}