防止Windows工作站(桌面)在运行WPF程序时锁定

Ale*_*tov 28 .net c# windows winapi

问题:
我有一个WPF 全屏应用程序,它充当仪表板.计算机在域和域策略中强制计算机在最后一次用户活动后10分钟内被锁定.我想防止工作站(或桌面)自动锁定.
此类行为的一个示例:Windows Media Player,可在电影运行时阻止此行为.

已知的解决方案(有点解决方法):

  1. 可以在每个固定的时间间隔(例如,每分钟)发送一次Win32 Mouse Move事件
  2. 可以在每个固定的时间间隔(例如,每分钟)向程序发送一个键(例如"左移"键).

问题:
如何在不使用这些变通方法的情况下阻止Windows工作站锁定?

免责声明:
我很确定,应该在StackOverflow上的某处回答类似的问题,但我没有发现任何问题.如果你能指出我正确的方向,我将不胜感激.

Mik*_*rie 27

通过评论已经指出了解决方案,但我为通过网络搜索到达的其他人提供了一个简单的入门解决方案:

/// <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
}
Run Code Online (Sandbox Code Playgroud)

放置逻辑的另一个位置是在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);
        }
    });
Run Code Online (Sandbox Code Playgroud)