防止 Windows 工作站(桌面)在运行 WPF 程序时锁定
本文关键字:WPF 运行 程序 锁定 Windows 工作站 桌面 防止 | 更新日期: 2023-09-27 18:18:39
问题:
我有一个 WPF 全屏应用程序,它充当仪表板。计算机位于域中,域策略强制计算机在上次用户活动后 10 分钟内锁定。我想防止工作站(或桌面(自动锁定。
此类行为的一个示例:Windows 媒体播放器,可在电影运行时阻止此操作。
已知解决方案(某种解决方法(:
- 可以每隔固定的时间间隔(例如,每分钟(发送一次 Win32 鼠标移动事件
- 可以每隔固定的时间间隔(例如,每分钟(向程序发送一个键(例如"左移"键向上(
问题:
如何在不使用这些解决方法的情况下防止 Windows 工作站锁定?
免責聲明:
我很确定,在StackOverflow的某个地方应该有一个类似的问题,但我没有找到。如果您能指出我正确的方向,我将不胜感激。
该
解决方案已通过评论指出,但我为通过网络搜索到达的其他人提供了一个简单的入门解决方案:
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
public App()
{
InitializeComponent();
App.Current.Startup += new StartupEventHandler((sender, e) =>
{
SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
});
App.Current.Exit += new ExitEventHandler((sender, e) =>
{
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);
});
}
}
[FlagsAttribute]
public enum EXECUTION_STATE : uint
{
ES_AWAYMODE_REQUIRED = 0x00000040,
ES_CONTINUOUS = 0x80000000,
ES_DISPLAY_REQUIRED = 0x00000002,
ES_SYSTEM_REQUIRED = 0x00000001
// Legacy flag, should not be used.
// ES_USER_PRESENT = 0x00000004
}
放置逻辑的替代位置是将逻辑放在主应用程序窗口上用于StateChanged
的事件处理程序中:
this.StateChanged += new EventHandler((sender, e) =>
{
if (WindowState == System.Windows.WindowState.Maximized)
{
SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
}
else
{
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);
}
});