Получение простоя системы с помощью Qt - PullRequest
5 голосов
/ 12 октября 2010

Я новичок в 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);
}

Я еще не узналкак ссылаться на функции Windows API через импорт DLL или любой другой эквивалент C ++.Честно говоря, я бы предпочел избегать их, если это возможно.Это приложение переходит на Mac OSX и, возможно, в будущем также на Linux.

Существует ли какой-либо конкретный Qt, независимый от платформы, способ для простоя системы?Это означает, что пользователь не касался мыши или каких-либо клавиш в течение времени X.

Заранее благодарим вас за любую помощь, которую вы можете предоставить.

1 Ответ

2 голосов
/ 14 октября 2010

Так как никто, кажется, не знает, и я не уверен, что это вообще возможно, я решил установить таймер опроса с малым интервалом, чтобы проверить текущие значения X, Y мыши. Я знаю, что это не идеальное решение, но ...

  1. Он будет работать кроссплатформенно, и я не буду делать специфические для платформы вещи (например, импорт DLL, гадость)
  2. Это служит той цели, в которой я нуждаюсь: для определения, активно ли кто-то использует систему или нет

Да, да, я знаю, что могут быть ситуации, когда у кого-то может не быть мыши или чего-то еще. Сейчас я называю это «состоянием низкой активности». Достаточно хорошо. Вот код:

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