Насколько я знаю, вы правы в том, что вы не можете определить, когда устройство переходит в режим ожидания, только когда оно выходит с использованием CeRunAppAtEvent API.
Лучший подход к проблеме - попытаться предотвратить зависание устройства вокруг критических частей вашего кода.
Существует два способа сделать это в зависимости от того, как работает ваше приложение. Если он работает как часть взаимодействия с пользователем, вам нужно вызвать некоторые API, чтобы убедиться, что устройство никогда не переходит в режим ожидания.
Вам необходимо настроить следующий код для запуска по крайней мере один раз каждые 10 секунд.
::SystemIdleTimerReset ();
::SHIdleTimerReset();
::keybd_event(VK_LBUTTON, 0, KEYEVENTF_SILENT, 0);
::keybd_event(VK_LBUTTON, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0);
Если ваше приложение работает как фоновое приложение, то вам нужно поместить код вокруг блока автономного режима питания, одновременно выполняя приведенный выше код. См. Мой ответ для получения дополнительной информации о режиме автоматического управления.