我的程序运行时,我必须阻止窗口进入睡眠状态.
而且我不仅想要阻止睡眠定时器,我还想取消睡眠事件,如果我按下睡眠按钮或以任何其他方式主动告诉计算机睡眠.因此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,这很费劲(很难阅读),我在网上搜索了一个基于PowerCreateRequest的c#的具体例子,发现了http://go4answers.webhost4life.com /Example/problem-monitor-wakeup-service-windows7-12092.aspx [编辑2016 - 不再可用]
根据我的需要复制并调整它(从msdn复制的CloseHandle的PInvoke ):
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 ////// Prevent screensaver, display dimming and power saving. This function wraps PInvokes on Win32 API. /// /// True to get a constant display and power - False to clear the settings 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内