Как определить, когда заставка на компьютере может быть включена при бездействии пользователя и отсутствии активных процессов?

119
17 июня 2021, 14:20

Как определить, когда заставка на компьютере может быть включена при бездействии пользователя и отсутствии активных процессов?

Перед тем как включается заставка, должны быть соблюдены некоторые условия:

  1. время, когда заставка должна быть включена;
  2. бездействия пользователя;
  3. отсутствия активных процессов, таких как: воспроизведение видео, звука или игры и.т.д.

Вопрос: Меня интересует, как именно можно определить, соблюдаются ли условия номер 2 и 3 или не соблюдаются. Как можно это сделать? Как это определяет windows?

К примеру, PowerManager определяет это с помощью команды

powercfg /requests

но у неё нет API.

А как это определяется в заставках, может быть есть API относительно этой функции?

Answer 1

Возможно, Вам подойдут 2 функции из Win32 API:

  • SystemParametersInfo
  • GetLastInputInfo

С помощью первой функции можно определить, не выполняется ли в данный момент скринсейвер; можно узнать, через какое время бездействия будет запущен скринсейвер; и многое другое...

Представляет интерес тот факт, что видеопроигрыватели и игры часто устанавливают в системе флаг SPI_SETSCREENSAVERRUNNING, чтобы предотвратить запуск скринсейвера.

Так что, целенаправленно отслеживать наличие в системе запущенного видеопроигрывателя или игры нет нужды (возможно, за исключением каких-то специфических случаев). Достаточно проверять флаг SPI_GETSCREENSAVERRUNNING.

Вторая функция возвращает время последнего пользовательского ввода (мышь, клавиатура, др. устройства ввода), в том же формате, что функция GetTickCount().

Пример кода:

#include <Windows.h>
#include <iostream>
using namespace std;
void main()
{
    setlocale(LC_ALL, "RU-ru");
    BOOL is_screensaver_running;
    if (SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &is_screensaver_running, 0))
    {
        if (!is_screensaver_running)
        {
            ULONG screensaver_timeout;
            if (SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, &screensaver_timeout, 0))
                for (int i = 0; i < 5; i++)
                {
                    LASTINPUTINFO info;
                    ZeroMemory(&info, sizeof(info));
                    info.cbSize = sizeof(info);
                    if (GetLastInputInfo(&info))
                    {
                        ULONGLONG diff = (GetTickCount() - info.dwTime) / 1000;
                        cout << "LAST_INPUT был примерно " << diff << " сек. тому назад;  до запуска скринсейвера осталось: " << (screensaver_timeout - diff) << " сек." << endl;
                    }
                    Sleep(2000);
                }
        }
        else
            cout << "Скринсейвер уже выполняется" << endl;
    }
}

Ссылки на MSDN:

  • функция SystemParametersInfo: https://docs.microsoft.com/ru-ru/windows/win32/api/winuser/nf-winuser-systemparametersinfoa
  • функция GetLastInputInfo: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getlastinputinfo
READ ALSO
Работа с SQLite и ClosedXml

Работа с SQLite и ClosedXml

Мне нужно вытащить все из базы данных в Exel файл, работаю с SQLite and ClosedXmlРаботаю по шаблону, заранее созданный шаблон, нужно все вывести

84
C# отправить POST запрос и получить ответ

C# отправить POST запрос и получить ответ

Доброе время суток, я не знаю как отправить ПОСТ запрос, но при этом получить ответ от сервера и вывести на экран (типа MessageBox)Помогите пожалуйста

113
Не меняется bool значение или я не правильно его пытаюсь изменить/прочитать

Не меняется bool значение или я не правильно его пытаюсь изменить/прочитать

хочу, чтобы success менялся на true или false в зависимости от ответа apiКод:

83
MySql запрос (Subquery returns more than 1 row)

MySql запрос (Subquery returns more than 1 row)

Пытаю выполнить вот такой запрос INSERT INTO catalog_product_entity_int(attribute_id, store_id, entity_id, value) VALUES (558, 0, (SELECT cpeentity_id FROM catalog_product_entity cpe LEFT JOIN catalog_product_entity_int cpei ON cpe

74