用C#防止屏幕睡眠

问题描述 投票:4回答:1

我创建了一个小型的C#控制台应用程序,用于在屏幕上移动指针,希望这可以防止屏幕在几分钟后睡眠/锁定。不幸的是,屏幕在几分钟后仍然进入睡眠状态。

有没有人知道它是否真的可以用C#写一些东西,就像用户输入(鼠标或键盘),并防止屏幕自动睡眠/锁定?

这就是我所拥有的,我认为可以做到这一点。

class Program
{
    [DllImport("user32.dll")]
    static extern bool SetCursorPos(int X, int Y);

    static Random rnd = new Random();

    static void Main(string[] args)
    {

        Rectangle screenRes = Screen.PrimaryScreen.Bounds;
        int widtMax = screenRes.Width;
        int heighMax = screenRes.Height;

        int w;
        int h;

        do
        {
            while (!Console.KeyAvailable)
            {
                w = rnd.Next(1, widtMax);
                h = rnd.Next(1, heighMax);

                SetCursorPos(w, h);
                System.Threading.Thread.Sleep(1000);
            }
        } while (Console.ReadKey(true).Key != ConsoleKey.Escape);
    }
}
c# .net windows user-input
1个回答
6
投票

你可以使用SetThreadExecutionState

允许应用程序通知系统它正在使用中,从而防止系统在应用程序运行时进入睡眠状态或关闭显示器。

备注

在没有SetThreadExecutionState的情况下调用ES_CONTINUOUS只会重置空闲计时器;为了使显示器或系统保持工作状态,线程必须定期调用SetThreadExecutionState

要在电源管理的计算机上正常运行,传真服务器,应答机,备份代理和网络管理应用程序等应用程序在处理事件时必须同时使用ES_SYSTEM_REQUIREDES_CONTINUOUS。多媒体应用程序(如视频播放器和演示应用程序)在长时间无需用户输入的情况下长时间显示视频时必须使用ES_DISPLAY_REQUIRED。文字处理程序,电子表格,浏览器和游戏等应用程序无需调用SetThreadExecutionState

的DllImport

[DllImport("kernel32.dll", CharSet = CharSet.Auto,SetLastError = true)]
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);

枚举

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

用法

void PreventSleep ()
{
    // Prevent Idle-to-Sleep (monitor not affected) (see note above)
    SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_AWAYMODE_REQUIRED);
}

.

© www.soinside.com 2019 - 2024. All rights reserved.