我需要禁用连接待机模式,直到我的桌面应用程序完成。 期望的行为应该类似于通过远程桌面连接到该机器时发生的情况。 也就是说,屏幕被closures,但系统在我断开之前不会进入睡眠状态。
是否有任何logging或无证的方式来获得我的应用程序相同的行为?
我尝试PowerSetRequest使用PowerRequestExecutionrequired和/或PowerRequestAwayModerequired ,但系统在几分钟内仍然进入连接待机模式。 我目前使用PowerRequestdisplayrequired来保持它活着,但屏幕始终保持。
编辑。 这是testing应用程序。 按下硬件电源button后,计时器滴答不超过5分钟,屏幕closures(使用电池供电)。
如何处理NotifyIcon,发生超时(C#)后
我如何检索显示器信息?
在ToolStripMenuItem中捕获mouseClick和KeyDown事件
从Windows服务启动一个Windows应用程序
Xamarin Studio不能build立一个控制台应用程序
using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace CsTestApp { public partial class MainForm : Form { public MainForm() { InitializeComponent(); this.Load += MainForm_Load; } void MainForm_Load(object sender,EventArgs e) { // init timer var timer = new System.Windows.Forms.Timer(); timer.Interval = 1000; timer.Tick += delegate { System.Diagnostics.Trace.WriteLine("CsTestApp: " + DateTime.Now); }; timer.Start(); // set GUID_EXECUTION_required_REQUEST_TIMEOUT IntPtr pActiveSchemeGuid; var hr = PowerGetActiveScheme(IntPtr.Zero,out pActiveSchemeGuid); if (hr != 0) Marshal.ThrowExceptionForHR((int)hr); Guid activeSchemeGuid = (Guid)Marshal.PtrToStructure(pActiveSchemeGuid,typeof(Guid)); LocalFree(pActiveSchemeGuid); int savedTimeout; hr = PowerReadDCValueIndex( IntPtr.Zero,activeSchemeGuid,GUID_IDLE_RESILIENCY_SUBGROUP,GUID_EXECUTION_required_REQUEST_TIMEOUT,out savedTimeout); if (hr != 0) Marshal.ThrowExceptionForHR((int)hr); hr = PowerWriteDCValueIndex( IntPtr.Zero,-1); if (hr != 0) Marshal.ThrowExceptionForHR((int)hr); // create power request var powerRequestContext = new POWER_REQUEST_CONTEXT(); powerRequestContext.Version = POWER_REQUEST_CONTEXT_VERSION; powerRequestContext.Flags = POWER_REQUEST_CONTEXT_SIMPLE_STRING; powerRequestContext.SimpleReasonString = "disable Connected Standby"; var powerRequest = PowerCreateRequest(ref powerRequestContext); if (powerRequest == IntPtr.Zero) ThrowLastWin32Error(); // set PowerRequestExecutionrequired if (!PowerSetRequest(powerRequest,PowerRequestType.PowerRequestExecutionrequired)) ThrowLastWin32Error(); this.FormClosed += delegate { timer.dispose(); PowerClearRequest(powerRequest,PowerRequestType.PowerRequestExecutionrequired); CloseHandle(powerRequest); hr = PowerWriteDCValueIndex( IntPtr.Zero,savedTimeout); if (hr != 0) Marshal.ThrowExceptionForHR((int)hr); }; } // power API interop static void ThrowLastWin32Error() { throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); } enum PowerRequestType { PowerRequestdisplayrequired = 0,PowerRequestSystemrequired = 1,PowerRequestAwayModerequired = 2,PowerRequestExecutionrequired = 3,PowerRequestMaximum } [StructLayout(LayoutKind.Sequential)] struct PowerRequestContextDetailed@R_658_4045@ion { public IntPtr LocalizedReasonModule; public UInt32 LocalizedReasonId; public UInt32 ReasonStringCount; [MarshalAs(UnmanagedType.LPWStr)] public string[] ReasonStrings; } [StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)] struct POWER_REQUEST_CONTEXT_DETAILED { public UInt32 Version; public UInt32 Flags; public PowerRequestContextDetailed@R_658_4045@ion Detailed@R_658_4045@ion; } [StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)] struct POWER_REQUEST_CONTEXT { public UInt32 Version; public UInt32 Flags; [MarshalAs(UnmanagedType.LPWStr)] public string SimpleReasonString; } const int POWER_REQUEST_CONTEXT_VERSION = 0; const int POWER_REQUEST_CONTEXT_SIMPLE_STRING = 0x1; const int POWER_REQUEST_CONTEXT_DETAILED_STRING = 0x2; static readonly Guid GUID_IDLE_RESILIENCY_SUBGROUP = new Guid(0x2e601130,0x5351,0x4d9d,0x8e,0x4,0x25,0x29,0x66,0xba,0xd0,0x54); static readonly Guid GUID_EXECUTION_required_REQUEST_TIMEOUT = new Guid(0x3166bc41,0x7e98,0x4e03,0xb3,0x4e,0xec,0xf,0x5f,0x2b,0x21,0x8e); [DllImport("kernel32.dll",SetLastError = true)] static extern IntPtr PowerCreateRequest(ref POWER_REQUEST_CONTEXT Context); [DllImport("kernel32.dll",SetLastError = true)] static extern bool PowerSetRequest(IntPtr PowerRequestHandle,PowerRequestType RequestType); [DllImport("kernel32.dll",SetLastError = true)] static extern bool PowerClearRequest(IntPtr PowerRequestHandle,SetLastError = true,ExactSpelling = true)] static extern bool CloseHandle(IntPtr hObject); [DllImport("kernel32.dll",SetLastError = true)] static extern IntPtr LocalFree(IntPtr hMem); [DllImport("PowrProf.dll",CharSet = CharSet.Unicode)] static extern UInt32 PowerWriteDCValueIndex(IntPtr RootPowerKey,[MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,[MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,[MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,int AcValueIndex); [DllImport("PowrProf.dll",CharSet = CharSet.Unicode)] static extern UInt32 PowerReadDCValueIndex(IntPtr RootPowerKey,out int AcValueIndex); [DllImport("PowrProf.dll",CharSet = CharSet.Unicode)] static extern UInt32 PowerGetActiveScheme(IntPtr UserPowerKey,out IntPtr ActivePolicyGuid); } }
这是powercfg.exe /requests的输出:
执行:
[PROCESS] Device HarddiskVolume4 Users avo Test CsTestApp.exe
禁用连接待机
命令行窗口编译器(cl.exe)目标
如何快速而可靠地确定是否安装了Visual C ++ 2013 Runtime
SlimDX:Joystick.Poll()成功断开游戏手柄
静态string使用File.ReadAllText
错误“无法find为主要方法指定的xxxx.Program”从MS示例创buildWindows服务
显然, PowerRequestExecutionrequired有一个(很差)记录的超时值,所以“滥用”API不会延迟实际的AoAc机器的睡眠请求。
在你的情况下,可能你最好的选择是使用PowerWriteACValueIndex设置超时(-1禁用超时):
ReturnCode = PowerWriteACValueIndex(NULL,pGuidActivePowerScheme,&GUID_IDLE_RESILIENCY_SUBGROUP,&GUID_EXECUTION_required_REQUEST_TIMEOUT,-1);
这是一个类似的问题,没有答案 。 我在我的基于Z3700的平板电脑上试过了PowerSetRequest / PowerRequestExecutionrequired ,而且我看到了相同的行为,平板电脑在〜5分钟内进入了连接待机模式,无论此功率请求如何。
网上关于连接模式内部的信息并不多,但我找到了下面的可下载文件: “连接待机简介” 。 以下是进入连接待机模式的相关部分:
相名 :
连接阶段。
说明 :
系统正在检查远程桌面连接。
执行的任务 :
•确定是否存在远程桌面会话。
•开始追踪未完成的电力需求。
退出时 :
没有连接远程桌面会话。
…
相名 :
桌面活动主持人(dam)阶段。
说明 :
系统暂停桌面应用程序以减少。
执行的任务 :
•检查未完成的功率请求( PowerRequestExecutionrequired )。
•等待应用程序释放出色的电源请求,或强制执行电池电源的最大超时(5分钟)。
退出时 :
所有未决的电源请求已被应用程序清除或达到最大超时。 在连接待机期间的消耗。
所以,对远程连接确实有一些特殊的处理,但对于其他服务,您有多达5分钟的时间来完成或暂停您的PowerRequestExecutionrequired活动。 根据我的经验,即使在平板电脑供电的情况下也是如此。
海事组织,这是一个糟糕的设计决定 。 它不是一个Windows RT平板电脑,它是全功能的Windows 8.1 Pro机器,如果我们愿意的话,至少对于可信的桌面应用程序,必须有一种方法可以使电池保持活跃状态。
可以完全禁用连接待机模式 ,但在这种情况下,硬件电源按钮不能用于关闭和打开显示器。
所以,我讨厌成为一个不可能的家伙,但我认为没有官方的方法来禁用远程访问守护进程的连接备用。 我希望有人会发表更好的答案。
更新后 ,这个文件还提到了“维护阶段”:
系统执行维护任务。
如果运行,等待维护任务完成
(最常见的交流电源)。
退出时…没有系统维护任务正在运行。
•通常少于1秒。
•系统最有可能在交流电源的维护阶段阻塞。
也许,可以通过Windows Task Scheduler API启动一个持续的维护任务,但是如果使用电池供电, CS模式将不会被输入。 我没有试过这个。
这可能是最蹩脚的解决方法,但如果你保持沟音乐应用程序在后台播放,它应该仍然让你的电脑保持其他进程
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。