Ashley
Ashley

Reputation: 81

Disable Suspend in Window CE

I have a system that requires the application to always be running.

I have set all of the registry settings in [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Timeouts] to 0 (which I am told should disable the timeout).

The system is still suspending, we are running on Windows CE 6.0 R3 in Full Power Management mode.

Upvotes: 2

Views: 2577

Answers (3)

BitBank
BitBank

Reputation: 8715

Another method which works equally well, but may be considered a hack is to periodically output a fake keypress. This function can be used:

keybd_event(VKEY_F24, 0, KEYEVENTF_KEYUP, 0);

If you output a non-existant key such as VKEY_F24 and use the keyup code, that will keep the system awake and be ignored by the running applications. Depending on your system's default timeout, this may need to be done once every 30 seconds.

Upvotes: 0

StaWho
StaWho

Reputation: 2488

Like in AAT's answer, you have to trigger reload event. Working implementation below:

    private static void DoAutoResetEvent()
    {
        string eventString = "PowerManager/ReloadActivityTimeouts";

        IntPtr newHandle = CreateEvent(IntPtr.Zero, false, false, eventString);
        EventModify(newHandle, (int)EventFlags.EVENT_SET);
        CloseHandle(newHandle);
    }

    private enum EventFlags
    {
        EVENT_PULSE = 1,
        EVENT_RESET = 2,
        EVENT_SET = 3
    }

    [DllImport("coredll.dll", SetLastError = true)]
    private static extern IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset, bool bInitialState, string lpName);

    [DllImport("coredll")]
    static extern bool EventModify(IntPtr hEvent, int func);

    [DllImport("coredll.dll", SetLastError = true)]
    private static extern bool CloseHandle(IntPtr hObject);

Upvotes: 3

AAT
AAT

Reputation: 3386

After you make any changes to the Control\Power\Timeouts registry entries you need to kick a special event so that the system knows to reload the timeout settings. It is a named event called PowerManager/ReloadActivityTimeouts so you need a snippet like

    HANDLE hEvent = CreateEvent(NULL, 
                                FALSE, 
                                FALSE, 
                                _T("PowerManager/ReloadActivityTimeouts"));
    if(hEvent != NULL)
    {
        SetEvent(hEvent);
        CloseHandle(hEvent);
    }

(That is verbatim from our Win CE application which sets up and turns off timeouts according to the users' wishes.)

Upvotes: 1

Related Questions