2012-01-11 70 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