我试图弄清楚如何跟踪用户何时从计算机闲置,这不仅意味着我的应用程序。原因是我希望我的应用程序能够在一定时间后将用户设置为“离开”。想像Skype那样在X分钟后将你带走。
任何想法如何实现这一目标?
修改
我到目前为止跟踪鼠标的原因是什么:
//Init
mouseTimer = new QTimer();
mouseLastPos = QCursor::pos();
mouseIdleSeconds = 0;
//Connect and Start
connect(mouseTimer, SIGNAL(timeout()), this, SLOT(mouseTimerTick()));
mouseTimer->start(1000);
void MainWindow::mouseTimerTick()
{
QPoint point = QCursor::pos();
if(point != mouseLastPos)
mouseIdleSeconds = 0;
else
mouseIdleSeconds++;
mouseLastPos = point;
//Here you could determine whatever to do
//with the total number of idle seconds.
qDebug() << mouseIdleSeconds;
}
是否还可以添加键盘?
答案 0 :(得分:6)
有特定于平台的方法来获取空闲用户通知。你应该几乎总是使用它们,而不是自己动手。
假设您坚持要自己编写代码。在X11,OS X和Windows上,应用程序根本不会收到任何针对其他应用程序的事件。 Qt在监控此类全球事件方面没有提供太多帮助。您需要挂钩相关的全局事件,并过滤它们。这是特定于平台的。
因此,无论您做什么,您都必须编写一些前端API,以公开您所使用的功能,并编写一个或多个特定于平台的后端。
首选的特定于平台的空闲时间API为:
在Windows上GetLastInputInfo
,请参阅this answer。
在OS X上,NSWorkspaceWillSleepNotification
和NSWorkspaceDidWakeNotification
,请参阅this answer。
在X11上,它是the screensaver API:
/* gcc -o getIdleTime getIdleTime.c -lXss */
#include <X11/extensions/scrnsaver.h>
#include <stdio.h>
int main(void) {
Display *dpy = XOpenDisplay(NULL);
if (!dpy) {
return(1);
}
XScreenSaverInfo *info = XScreenSaverAllocInfo();
XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info);
printf("%u", info->idle);
return(0);
}
答案 1 :(得分:1)
<击> 最好的办法是检查鼠标和键盘事件。 击>
<击>如果您覆盖eventFilter
功能并在该检查中执行以下操作:
QEvent::MouseButtonPress
QEvent::MouseButtonRelease
QEvent::Wheel
QEvent::KeyPress
QEvent::KeyRelease
创建一个QTimer
,它将在events
中的任何一个上重置,如果没有,只需让计时器打勾并在你希望的任何intervalls中触发回调。
击>
编辑:
有关详细信息,请参阅评论和Kuba Ober的答案。