防止运行WPF程序时Windows工作站(台式机)锁定

32

问题:
我有一个WPF全屏应用程序,作为仪表板使用。计算机处于域中,域策略强制计算机在用户最后活动后10分钟内锁定。我想要阻止工作站(或桌面)自动锁定。
这种行为的示例:Windows Media Player,它可以在播放电影时防止计算机锁定。

已知解决方案(有点儿绕过去):

  1. 可以每隔一段固定时间(例如每分钟)发送Win32鼠标移动事件
  2. 可以每隔一段固定时间(例如每分钟)向程序发送一个按键(例如“左Shift”键上升)

问题:
如何在不使用这些解决方案的情况下防止windows工作站锁定?

免责声明:
我非常确定StackOverflow上有类似的问题被回答了,但我没有找到。如果您能指引我正确的方向,我将不胜感激。


4
你正在寻找Win32 SetThreadExecutionState()函数,但更好的解决方案是使用组策略。 - Cody Gray
太好了!你能把那个作为答案发布吗? - Alexander Yezutov
您可能还想将此链接添加为:http://pinvoke.net/default.aspx/kernel32.SetThreadExecutionState - Alexander Yezutov
还可以看看这篇由出色的Raymond Chen所写的文章 :) - Deanna
1个回答

32

虽然评论中已经提供了解决方案,但我为那些通过网络搜索进入的其他人提供一个简单的起始解决方案:

/// <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);
        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接