如何取消待机和休眠?

时间:2009-05-05 08:50:21

标签: c# .net

我的应用程序在C#中运行,使用第三方框架。它可以作为许多应用程序的UI。我的问题是当我的应用程序运行时,系统不应该发生备用/ hybernate操作系统操作。不知何故,我必须取消OS提出的待机/ hybernate事件。请在这方面帮助我。

由于 太阳

3 个答案:

答案 0 :(得分:4)

blog post介绍了如何使用SetThreadExecutionState阻止PC进入休眠状态。代码如下所示:

public partial class Window1 : Window
{
    private uint m_previousExecutionState;

    public Window1()
    {
        InitializeComponent();

        // Set new state to prevent system sleep (note: still allows screen saver)
        m_previousExecutionState = NativeMethods.SetThreadExecutionState(
            NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED);
        if (0 == m_previousExecutionState)
        {
            MessageBox.Show("Call to SetThreadExecutionState failed unexpectedly.",
                Title, MessageBoxButton.OK, MessageBoxImage.Error);
            // No way to recover; fail gracefully
            Close();
        }
    }

    protected override void OnClosed(System.EventArgs e)
    {
        base.OnClosed(e);

        // Restore previous state
        if (0 == NativeMethods.SetThreadExecutionState(m_previousExecutionState))
        {
            // No way to recover; already exiting
        }
    }
}

internal static class NativeMethods
{
    // Import SetThreadExecutionState Win32 API and necessary flags
    [DllImport("kernel32.dll")]
    public static extern uint SetThreadExecutionState(uint esFlags);
    public const uint ES_CONTINUOUS = 0x80000000;
    public const uint ES_SYSTEM_REQUIRED = 0x00000001;
}

如果您喜欢帖子中描述的应用程序,则会有更新版本here

答案 1 :(得分:1)

无法从.NET中取消该事件。您必须通过处理WM_POWERBROADCAST并返回BROADCAST_QUERY_DENY来使用P / Invoke和Win32 API执行此操作。看看this CodeGuru page是否朝正确方向推进。

同样令人感兴趣的是this page,详细说明了当用户注销或暂停/休眠时在.NET中触发的一些事件。

答案 2 :(得分:0)

Powercfgshutdown(特别是shutdown /a中止系统关闭)可能会证明是有用的。