Prevent Windows workstation (desktop) from locking while running a WPF program

12,790

The solution has been pointed out through the comments, but I'm providing a simple starter solution for anyone else arriving via a web search:

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

An alternative place to put the logic would be within an event handler for StateChanged on your main application window:

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);
        }
    });
Share:
12,790
Alexander Yezutov
Author by

Alexander Yezutov

Microsoft Certified Professional Developer and IT professional with over 10 years of experience in commerce and healthcare. Practical technologist with solid design and problem solving skills. Proficient in .NET and ready to utilize any suitable technology for the task. Strong believer in automation as part of continuous integration and continuous delivery process. Collaborative and energetic team member, always listening to peers and facilitating discussion. Enthusiastic proponent of agile methodology, customer feedback and short delivery cycles. Excellent communication skills allowed for a role of a medium between stakeholders and team members.

Updated on June 15, 2022

Comments

  • Alexander Yezutov
    Alexander Yezutov almost 2 years

    Issue:
    I have a WPF fullscreen application, which acts as a dashboard. The computer is in domain and domain policies enforce the computer to be locked in 10 minutes after the last user activity. I want to prevent the workstation (or desktop) from locking automatically.
    An example of such behavior: Windows Media Player, which prevents this while a movie is running.

    Known solutions (kinda workarounds):

    1. It is possible to send a Win32 Mouse Move event every fixed interval of time (for example, every minute)
    2. It is possible to send a key to the program (for example "Left Shift" key up) every fixed interval of time (for example, every minute)

    QUESTION:
    How can I prevent windows workstation from locking without using these workarounds?

    Disclaimer:
    I was pretty sure, there should be a similar question answered somewhere on StackOverflow, but i didn't find any. I would appreciate, if you could point me into the right direction.