質問

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

ありがとう!

役に立ちましたか?

解決

実行中にプログラムをスリープ状態にしたくない場合、最良の方法は、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
}

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

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

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

他のヒント

特定のスリープに影響する Power Managerレジストリ設定を変更必要な条件(タイムアウト、バッター、AC電源など)および&quot; PowerManager / ReloadActivityTimeouts&quot;という名前のシステムイベントのSetEvent; OSに設定を再読み込みするように指示します。

「システムの電源状態」を変更することにより、 ここに記載(ただしc#で)

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top