Если вы хотите, чтобы ваша программа не переводилась в спящий режим во время ее работы, лучше всего создать функцию типа KeepAlive, которая вызывает SystemIdleTimerReset, SHIdleTimerReset и имитирует касание клавиш. Тогда вам нужно называть это много, в основном везде.
#include <windows.h>
#include <commctrl.h>
extern "C"
{
void WINAPI SHIdleTimerReset();
};
void KeepAlive()
{
static DWORD LastCallTime = 0;
DWORD TickCount = GetTickCount();
if ((TickCount - LastCallTime) > 1000 || TickCount < LastCallTime) // watch for wraparound
{
SystemIdleTimerReset();
SHIdleTimerReset();
keybd_event(VK_LBUTTON, 0, KEYEVENTF_SILENT, 0);
keybd_event(VK_LBUTTON, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0);
LastCallTime = TickCount;
}
}
Этот метод работает только тогда, когда пользователь запускает приложение вручную.
Если ваше приложение запускается с помощью уведомления (то есть, когда устройство приостановлено), то вам нужно сделать больше, иначе ваше приложение будет приостановлено через очень короткий промежуток времени, пока пользователь не отключит питание устройства из приостановленного режима. , Для этого вам необходимо перевести устройство в режим автономного питания.
if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, TRUE))
{
// handle error
}
// do long running process
if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, FALSE))
{
// handle error
}
Во время использования в автоматическом режиме вам все равно нужно многократно вызывать KeepAlive, вы можете использовать отдельный поток, который спит в течение x миллисекунд и вызывает функцию keep alive.
Обратите внимание, что автоматический режим не выводит его из спящего режима, он переводит устройство в странное полусонное состояние.
Таким образом, если вы запустите автоматический режим, когда устройство находится в режиме ожидания, оно не разбудит экран или что-либо еще. Все, что делает без присмотра, - это не дает WM приостановить работу вашего приложения. Кроме того, другая проблема заключается в том, что он работает не на всех устройствах, управление питанием некоторых устройств не очень хорошее и оно в любом случае приостановит работу независимо от того, что вы делаете.