当用户从计算机空闲时QT跟踪?

时间:2014-02-20 07:47:58

标签: qt

我试图弄清楚如何跟踪用户何时从计算机闲置,这不仅意味着我的应用程序。原因是我希望我的应用程序能够在一定时间后将用户设置为“离开”。想像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;
}

是否还可以添加键盘?

2 个答案:

答案 0 :(得分:6)

有特定于平台的方法来获取空闲用户通知。你应该几乎总是使用它们,而不是自己动手。

假设您坚持要自己编写代码。在X11,OS X和Windows上,应用程序根本不会收到任何针对其他应用程序的事件。 Qt在监控此类全球事件方面没有提供太多帮助。您需要挂钩相关的全局事件,并过滤它们。这是特定于平台的。

因此,无论您做什么,您都必须编写一些前端API,以公开您所使用的功能,并编写一个或多个特定于平台的后端。

首选的特定于平台的空闲时间API为:

  • 在Windows上GetLastInputInfo,请参阅this answer

  • 在OS X上,NSWorkspaceWillSleepNotificationNSWorkspaceDidWakeNotification,请参阅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的答案。