2012-01-11 2 views
2

私は、アプリケーションを常に稼働させる必要があるシステムを持っています。ウィンドウ内のサスペンドを無効にするCE

[HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Power \ Timeouts]のすべてのレジストリ設定を0に設定しました(タイムアウトを無効にするように指示されています)。

システムはまだ停止しています。フルパワーマネージメントモードのWindows CE 6.0 R3で動作しています。

答えて

3

が必要PowerManager/ReloadActivityTimeoutsと呼ばれる名前のイベントです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#の1つがありませんでした! – AAT

+0

@AAT:利益分担に関しては私のことを覚えておいてください; – StaWho

1

Control\Power\Timeoutsレジストリエントリに変更を加えた後、システムがタイムアウト設定を再ロードすることがわかっているように特別なイベントを開始する必要があります。それはあなたがのように

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秒ごとに1回行う必要があります。

+0

'SystemIdleTimerReset()' APIを直接呼び出すことによって、偽のキーボードイベントのハックなしで同じことが達成できます。 – ctacke

+0

知っておいてよかったです - ありがとう:) – BitBank

関連する問題