禁用窗口CE中的挂起

时间:2012-01-11 21:05:20

标签: c# visual-studio-2008 windows-ce power-management

我的系统要求应用程序始终运行。

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

系统仍在暂停,我们在全功率管理模式下运行Windows CE 6.0 R3。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

(这是我们的Win CE应用程序的逐字记录,根据用户的意愿设置和关闭超时。)

答案 2 :(得分:0)

另一种同样有效的方法,但可能被视为黑客攻击是定期输出假按键。可以使用此功能:

keybd_event(VKEY_F24,0,KEYEVENTF_KEYUP,0);

如果输出不存在的密钥(如VKEY_F24)并使用密钥代码,则会使系统保持唤醒状态,并被正在运行的应用程序忽略。根据系统的默认超时,可能需要每30秒执行一次。