2012-01-11 57 views
2

我有一个系统需要应用程序始终运行。在窗口中禁用挂起CE

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

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

回答

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

+1:谢谢你,我有一个C++解决方案,但没有一个C#解决方案,以填补我留在市场上的空白! – AAT 2012-01-19 00:03:13

+0

@AAT:当谈到利润分享时,请记住关于我的内容;) – StaWho 2012-01-19 09:24:07

1

Control\Power\Timeouts注册表项进行任何更改后,您需要启动特殊事件以便系统知道重新加载超时设置。这是一个名为事件调用PowerManager/ReloadActivityTimeouts,所以你需要一个像

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

一个片段(也就是逐字从我们的Win CE的应用程序,它建立并关闭超时根据用户的意愿。)

0

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

keybd_event(VKEY_F24,0,KEYEVENTF_KEYUP,0);

如果输出一个不存在的键(例如VKEY_F24)并使用键控代码,这将使系统保持唤醒状态并被正在运行的应用程序忽略。根据系统的默认超时值,这可能需要每30秒完成一次。

+0

通过直接调用'SystemIdleTimerReset()'API,可以在没有假键盘事件攻击的情况下实现相同效果。 – ctacke 2012-01-12 20:45:26

+0

相关知识 - 谢谢:) – BitBank 2012-01-12 20:49:34