Windows Mobile 6でスリープモードを無効にする
-
05-07-2019 - |
質問
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()を定期的に呼び出す(デバイスの電源が切れないようにする)ことで、モバイルデバイスがスリープ状態になるのを防ぐ方法についても説明します(これは望みどおりではありません)。