[DllImport("coredll.dll")]
static extern void SystemIdleTimerReset();
Declare Sub SystemTimerReset Lib "coredll.dll" Alias "SystemIdleTimerReset" ()
None.
None.
To keep a device awake indefinitely, you can use SystemParametersInfo() (also in CoreDll) to query the three idle timeouts SPI_GETBATTERYIDLETIMEOUT, SPI_GETEXTERNALIDLETIMEOUT, and SPI_GETWAKEUPIDLETIMEOUT. Ignoring any values that are zero, use the minimum of these three values as your N, set a recurring timer to fire more often than every N seconds, and call SystemIdleTimerReset() every time it fires. When you're done with your critical operation, kill the timer, and the device will be able to sleep again. I tried this from C# and each idle-timeout value was 0, so I just called SystemIdleTimerReset() every 30 seconds during the critical operation.
You can also look at the configured timeouts at the registry key "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power".
Please add some!
/// <summary>
/// This function resets a system timer that controls whether or not the
/// device will automatically go into a suspended state.
/// </summary>
[DllImport("CoreDll.dll")]
public static extern void SystemIdleTimerReset();
private static int nDisableSleepCalls = 0;
private static System.Threading.Timer preventSleepTimer = null;
public static void DisableDeviceSleep()
{
nDisableSleepCalls++;
if (nDisableSleepCalls == 1)
{
Debug.Assert(preventSleepTimer == null);
// start a 30-second periodic timer
preventSleepTimer = new System.Threading.Timer(new TimerCallback(PokeDeviceToKeepAwake),
null, 0, 30 * 1000);
}
}
public static void EnableDeviceSleep()
{
nDisableSleepCalls--;
if (nDisableSleepCalls == 0)
{
Debug.Assert(preventSleepTimer != null);
if (preventSleepTimer != null)
{
preventSleepTimer.Dispose();
preventSleepTimer = null;
}
}
}
private static void PokeDeviceToKeepAwake(object extra)
{
try
{
SystemIdleTimerReset();
}
catch (Exception e)
{
// TODO
}
}