使用Qt获得系统空闲时间

时间:2010-10-12 02:54:41

标签: c# qt winapi cross-platform dllimport

几周前我是Qt的新手。我正在尝试用C ++重写一个C#应用程序,并且现在有很大一部分。我目前的挑战是找到一种方法来检测系统空闲时间。

使用我的C#应用​​程序,我从某个地方偷了代码:

public struct LastInputInfo
{
    public uint cbSize;
    public uint dwTime;
}

[DllImport("User32.dll")]
private static extern bool GetLastInputInfo(ref LastInputInfo plii);

/// <summary>
/// Returns the number of milliseconds since the last user input (or mouse movement)
/// </summary>
public static uint GetIdleTime()
{
    LastInputInfo lastInput = new LastInputInfo();
    lastInput.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInput);
    GetLastInputInfo(ref lastInput);

    return ((uint)Environment.TickCount - lastInput.dwTime);
}

我还没有学会如何通过DLL Imports或C ++等价物来引用Windows API函数。老实说,如果可能的话,我宁愿避免。此应用程序也将在未来转移到Mac OSX和Linux。

是否存在Qt特定的,与平台无关的方式来获得系统空闲时间?这意味着用户在X时间内没有触摸鼠标或任何键。

提前感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:2)

由于似乎没有人知道,而且我不确定这是否可能,我决定设置一个低间隔轮询计时器来检查鼠标的当前X,Y。我知道这不是一个完美的解决方案,但是......

  1. 它可以跨平台工作而不需要我做平台特定的事情(比如DLL导入,yuck)
  2. 它符合我的需要:确定某人是否正在积极使用该系统
  3. 是的,是的,我知道有些人可能没有鼠标等等。我现在称之为“低活动状态”。够好了。这是代码:

    mainwindow.h - 类声明

    private:
        QPoint mouseLastPos;
        QTimer *mouseTimer;
        quint32 mouseIdleSeconds;
    

    mainwindow.cpp - 构造函数方法

    //Init
    mouseTimer = new QTimer();
    mouseLastPos = QCursor::pos();
    mouseIdleSeconds = 0;
    
    //Connect and Start
    connect(mouseTimer, SIGNAL(timeout()), this, SLOT(mouseTimerTick()));
    mouseTimer->start(1000);
    

    mainwindow.cpp - 班级主体

    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.
    }