Как определить, когда заставка на компьютере может быть включена при бездействии пользователя и отсутствии активных процессов?
Перед тем как включается заставка, должны быть соблюдены некоторые условия:
Вопрос: Меня интересует, как именно можно определить, соблюдаются ли условия номер 2 и 3 или не соблюдаются. Как можно это сделать? Как это определяет windows?
К примеру, PowerManager определяет это с помощью команды
powercfg /requests
но у неё нет API.
А как это определяется в заставках, может быть есть API относительно этой функции?
Возможно, Вам подойдут 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:
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Мне нужно вытащить все из базы данных в Exel файл, работаю с SQLite and ClosedXmlРаботаю по шаблону, заранее созданный шаблон, нужно все вывести
Доброе время суток, я не знаю как отправить ПОСТ запрос, но при этом получить ответ от сервера и вывести на экран (типа MessageBox)Помогите пожалуйста
хочу, чтобы success менялся на true или false в зависимости от ответа apiКод:
Пытаю выполнить вот такой запрос 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