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
}
無人モードの使用中も、KeepAlive を何度も呼び出す必要があります。x ミリ秒間スリープし、キープ アライブ機能を呼び出す別のスレッドを使用できます。
無人モードではスリープ モードが解除されないことに注意してください。デバイスは奇妙な半覚醒状態になります。
そのため、デバイスがサスペンド モードのときに無人モードを開始すると、画面などは起動しません。無人モードで行うことは、WM がアプリケーションを中断するのを止めることだけです。また、他の問題は、すべてのデバイスで機能するわけではないことです.一部のデバイスの電源管理はあまり良くなく、何をしてもサスペンドされます.
必要な特定のスリープ状態 (タイムアウト、バッテリ、AC 電源など) に影響する Power Manager レジストリ設定と、「 PowerManager /ReloadActivityTimeouts」と呼ばれる名前付きシステム イベントの SetEvent を変更して、OS に設定をリロードするように指示します。
おそらく、ここで説明されているように「システム電源状態」を変更することによって(ただし、c#で)
この記事では、ネイティブ関数SystemIdleTimerReset()を定期的に呼び出すことで(デバイスの電源が切れるのを防ぐために)、モバイルデバイスがスリープ状態になるのを防ぐ方法についても説明しています(これは必ずしも希望どおりではありません)。