禁用Windows CE中的挂起

本文关键字:挂起 CE Windows 禁用 | 更新日期: 2023-09-27 18:19:58

我有一个系统,它要求应用程序始终在运行。

我已经将[HHKEY_LOCAL_MACHINE''SYSTEM''CurrentControlSet''Control''Power''Timeouts]中的所有注册表设置设置为0(我被告知应该禁用超时)。

系统仍处于挂起状态,我们在Windows CE 6.0 R3上以完全电源管理模式运行。

禁用Windows CE中的挂起

就像AAT的答案一样,您必须触发重载事件。以下工作实施:

    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);

Control'Power'Timeouts注册表项进行任何更改后,您需要启动一个特殊事件,以便系统知道如何重新加载超时设置。这是一个名为PowerManager/ReloadActivityTimeouts的命名事件,因此您需要一个类似的片段

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

(这与我们的Win CE应用程序完全相同,该应用程序根据用户的意愿设置和关闭超时。)

另一种同样有效但可能被视为破解的方法是定期输出假按键。此功能可用于:

keybd_event(VKEY_F24,0,KEYEVENTF_KEYUP,0);

如果您输出一个不存在的密钥,如VKEY_F24,并使用keyup代码,这将使系统保持清醒,并被正在运行的应用程序忽略。根据系统的默认超时,这可能需要每30秒进行一次。