プログラムの実行中にウィンドウがスリープ状態にならないようにする必要があります。
また、スリープタイマーを防止するだけでなく、スリープボタンを押すか、コンピューターにスリープ状態をアクティブに通知する場合は、スリープイベントをキャンセルします。したがって、SetThreadExecutionStateでは不十分です。
または...実際に睡眠を完全に妨げる必要はありません。プログラムがタスクを完了することができるように、5〜10秒遅らせるだけです。
(私はこれが悪いプログラムの振る舞いであることを知っていますが、それは個人的な使用のためだけです。)
USB経由で接続されたハードウェアデバイスでこのような問題が発生しました。 XP/Vistaは真ん中にスリープ/ハイバネートします...いいですね、再開したときはそのまま続行できます。ハードウェアがまだ接続されている場合!!!ユーザーは、彼らがそれを感じるときはいつでもケーブルを引き出します。
XPおよびVistaを処理する必要があります
XPの下でWM_POWERBROADCASTをトラップし、PBT_APMQUERYSUSPEND wparamを探します。
// See if bit 1 is set, this means that you can send a deny while we are busy
if (message.LParam & 0x1)
{
// send the deny message
return BROADCAST_QUERY_DENY;
} // if
else
{
return TRUE;
} // else
Vistaでは、次のようにSetThreadExecutionStateを使用します
// try this for Vista, it will fail on XP
if (SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED) == NULL)
{
// try XP variant as well just to make sure
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED);
} // if
アプリが終了したら、通常に戻します
// set state back to normal
SetThreadExecutionState(ES_CONTINUOUS);
検討した後 vimの答え
「PowerCreateRequest、PowerSetRequest、およびPowerClearRequest関数を使用することをお勧めします。」
msdn にリンクされたAvailabilityRequests.docxにアクセスすると、それに入るのに疲れます(読みすぎる)、具体的な例をウェブで検索しました c# に基づいていますPowerCreateRequestで見つかった http://go4answers.webhost4life.com/Example/problem-monitor-wakeup-service-windows7-12092.aspx [2016年の編集-もう利用できません]
それをコピーして私のニーズに合わせました(CloseHandleのPInvokeは msdn からコピーされました):
using System.Runtime.InteropServices;
#region prevent screensaver, display dimming and automatically sleeping
POWER_REQUEST_CONTEXT _PowerRequestContext;
IntPtr _PowerRequest; //HANDLE
// Availability Request Functions
[DllImport("kernel32.dll")]
static extern IntPtr PowerCreateRequest(ref POWER_REQUEST_CONTEXT Context);
[DllImport("kernel32.dll")]
static extern bool PowerSetRequest(IntPtr PowerRequestHandle, PowerRequestType RequestType);
[DllImport("kernel32.dll")]
static extern bool PowerClearRequest(IntPtr PowerRequestHandle, PowerRequestType RequestType);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
internal static extern int CloseHandle(IntPtr hObject);
// Availablity Request Enumerations and Constants
enum PowerRequestType
{
PowerRequestDisplayRequired = 0,
PowerRequestSystemRequired,
PowerRequestAwayModeRequired,
PowerRequestMaximum
}
const int POWER_REQUEST_CONTEXT_VERSION = 0;
const int POWER_REQUEST_CONTEXT_SIMPLE_STRING = 0x1;
const int POWER_REQUEST_CONTEXT_DETAILED_STRING = 0x2;
// Availablity Request Structures
// Note: Windows defines the POWER_REQUEST_CONTEXT structure with an
// internal union of SimpleReasonString and Detailed information.
// To avoid runtime interop issues, this version of
// POWER_REQUEST_CONTEXT only supports SimpleReasonString.
// To use the detailed information,
// define the PowerCreateRequest function with the first
// parameter of type POWER_REQUEST_CONTEXT_DETAILED.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct POWER_REQUEST_CONTEXT
{
public UInt32 Version;
public UInt32 Flags;
[MarshalAs(UnmanagedType.LPWStr)]
public string
SimpleReasonString;
}
[StructLayout(LayoutKind.Sequential)]
public struct PowerRequestContextDetailedInformation
{
public IntPtr LocalizedReasonModule;
public UInt32 LocalizedReasonId;
public UInt32 ReasonStringCount;
[MarshalAs(UnmanagedType.LPWStr)]
public string[] ReasonStrings;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct POWER_REQUEST_CONTEXT_DETAILED
{
public UInt32 Version;
public UInt32 Flags;
public PowerRequestContextDetailedInformation DetailedInformation;
}
#endregion
/// <summary>
/// Prevent screensaver, display dimming and power saving. This function wraps PInvokes on Win32 API.
/// </summary>
/// <param name="enableConstantDisplayAndPower">True to get a constant display and power - False to clear the settings</param>
private void EnableConstantDisplayAndPower(bool enableConstantDisplayAndPower)
{
if (enableConstantDisplayAndPower)
{
// Set up the diagnostic string
_PowerRequestContext.Version = POWER_REQUEST_CONTEXT_VERSION;
_PowerRequestContext.Flags = POWER_REQUEST_CONTEXT_SIMPLE_STRING;
_PowerRequestContext.SimpleReasonString = "Continuous measurement"; // your reason for changing the power settings;
// Create the request, get a handle
_PowerRequest = PowerCreateRequest(ref _PowerRequestContext);
// Set the request
PowerSetRequest(_PowerRequest, PowerRequestType.PowerRequestSystemRequired);
PowerSetRequest(_PowerRequest, PowerRequestType.PowerRequestDisplayRequired);
}
else
{
// Clear the request
PowerClearRequest(_PowerRequest, PowerRequestType.PowerRequestSystemRequired);
PowerClearRequest(_PowerRequest, PowerRequestType.PowerRequestDisplayRequired);
CloseHandle(_PowerRequest);
}
}
PowerCreateRequest、PowerSetRequest、およびPowerClearRequest関数を使用することをお勧めします。詳細とサンプルコード(C/C#)は中にあります http://msdn.Microsoft.com/en-us/library/windows/hardware/gg463205.aspx
スクリーンセーバーを使用しないようにするのと同じ手法が適用されます。 プログラムでWindowsスクリーンセーバーが起動しないようにする を参照してください。
一部のセキュリティ設定はこれを上書きできることに注意してください(特定の時間が経過した後にコンピューターを強制的にロックすることは1つです)。
スリープ状態になった場合は、復帰させるのはどうですか。
http://www.enterprisenetworksandservers.com/monthly/art.php?1049