7

Windows Mobileでスリープモードをプログラムで無効/有効にする方法を知っている人はいますか?

ありがとう!

4

3 に答える 3

8

プログラムが実行中にスリープ状態にならないようにする場合、最善の方法は、SystemIdleTimerReset、SHIdleTimerReset を呼び出してキー タッチをシミュレートする KeepAlive タイプの関数を作成することです。次に、基本的にどこでも、それをたくさん呼び出す必要があります。

#include <windows.h>
#include <commctrl.h>

extern "C"
{
    void WINAPI SHIdleTimerReset();
};

void KeepAlive()
{
    static DWORD LastCallTime = 0;
    DWORD TickCount = GetTickCount();
    if ((TickCount - LastCallTime) > 1000 || TickCount < LastCallTime) // watch for wraparound
    {
        SystemIdleTimerReset();
        SHIdleTimerReset();
        keybd_event(VK_LBUTTON, 0, KEYEVENTF_SILENT, 0);
        keybd_event(VK_LBUTTON, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0);
        LastCallTime = TickCount;
    }
}

このメソッドは、ユーザーがアプリケーションを手動で起動した場合にのみ機能します。

アプリケーションが通知によって開始された場合 (つまり、デバイスがサスペンドされている間)、さらに多くのことを行う必要があります。そうしないと、ユーザーがデバイスの電源をサスペンド モードから解除するまで、非常に短い時間の後にアプリケーションがサスペンドされます。これを処理するには、デバイスを無人電源モードにする必要があります。

if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, TRUE))
{
    // handle error
}

// do long running process

if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, FALSE))
{
    // handle error
}

無人モードの使用中も、KeepAlive を何度も呼び出す必要があります。x ミリ秒間スリープし、キープ アライブ機能を呼び出す別のスレッドを使用できます。

無人モードではスリープ モードが解除されないことに注意してください。デバイスは奇妙な半覚醒状態になります。

そのため、デバイスがサスペンド モードのときに無人モードを開始すると、画面などは起動しません。無人モードで行うことは、WM がアプリケーションを中断するのを止めることだけです。また、他の問題は、すべてのデバイスで機能するわけではないことです.一部のデバイスの電源管理はあまり良くなく、何をしてもサスペンドされます.

于 2008-10-29T22:32:51.730 に答える
6

必要な特定のスリープ状態 (タイムアウト、バッテリ、AC 電源など) に影響する Power Manager レジストリ設定と、「 PowerManager /ReloadActivityTimeouts」と呼ばれる名前付きシステム イベントの SetEvent を変更して、OS に設定をリロードするように指示します。

于 2008-10-29T13:31:31.153 に答える
1

おそらく、ここで説明されているように「システム電源状態」を変更することによって(ただし、c#で)

この記事では、ネイティブ関数SystemIdleTimerReset()を定期的に呼び出すことで(デバイスの電源が切れるのを防ぐために)、モバイルデバイスがスリープ状態になるのを防ぐ方法についても説明しています(これは必ずしも希望どおりではありません)。

于 2008-10-29T11:06:50.197 に答える