一个让屏幕常亮的方法

cyzn_lfss 9天前 263

我想实现在程序运行的时候,保持屏幕常亮,不屏幕保护也不息屏

像播放视频一样。

用了以下的方法,但好像不起作用


import win.scrnsave;

win.scrnsave.setConfig(active=false) //禁用屏保

import sys.power;

sys.power.setMonitorTimeout(0);//禁止黑屏


求各位大神给个方便点的,谢谢!

最新回复 (8)
  • popde 9天前
    0 2

    AI 回答的 

     在C#中,可以使用以下代码让屏幕常亮:
    using System;
    using System.Windows.Forms;
    
    namespace KeepScreenOn
    {
        public partial class Form1 : Form
        {
            //常量:使屏幕保持常亮
            private const uint WM_SYSCOMMAND = 0x0112;
            private const uint SC_MONITORPOWER = 0xF170;
            private const uint MONITOR_ON = 0x01;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                //关闭屏幕保护程序和显示器熄灭
                this.SettingChange("ScreenSaveActive", 0);
                this.SettingChange("MonitorPowerOffEnabled", 0);
    
                //设置屏幕常亮
                SendMessage(this.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_ON);
            }
    
            //调用SystemParametersInfo函数
            public void SettingChange(string valueName, int value)
            {
                bool result = SystemParametersInfo(0x14, value, null, 0);
            }
    
            //调用SendMessage函数
            [System.Runtime.InteropServices.DllImport("user32.dll")]
            private static extern int SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);
    
            //调用SystemParametersInfo函数
            [System.Runtime.InteropServices.DllImport("user32.dll")]
            private static extern bool SystemParametersInfo(uint uiAction, uint uiParam, Object pvParam, uint fWinIni);
        }
    }
    通过调用SendMessage函数发送消息来使屏幕常亮。使用SystemParametersInfo函数关闭屏幕保护程序和关闭显示器熄灭功能。在窗体加载时,通过调用SettingChange和SendMessage函数实现。


  • 小肥羊 8天前
    0 3
    给你个另辟蹊径的思路,用mouse库定时挪动一下鼠标看看有没有效,不确保一定有效
  • cyzn_lfss 8天前
    0 4
    小肥羊 给你个另辟蹊径的思路,用mouse库定时挪动一下鼠标看看有没有效,不确保一定有效

    鼠标移动这个方法肯定有用的! 只不过我希望的是能通过调用win的API来实现 

     AI回答的奇奇怪怪呢

     wimport win.kernel

    /* 定义防止息屏和锁屏的函数 */
    function preventScreenTimeout(){
        /* ES_CONTINUOUS 表示需要连续的执行状态
           ES_DISPLAY_REQUIRED 表示需要显示设备处于开启状态
           ES_SYSTEM_REQUIRED 表示需要系统处于开启状态 */
        const ES_CONTINUOUS = 0x80000000
        const ES_DISPLAY_REQUIRED = 0x2
        const ES_SYSTEM_REQUIRED = 0x1
        
        /* 调用API,组合标志以防止息屏和锁屏 */
        win.kernel.SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED)
    }

  • cyzn_lfss 7天前
    0 5

    话说,下边这种操作正确不? 

     var preventScreenTimeout = ::Kernel32.api("SetThreadExecutionState","void()" );

     preventScreenTimeout( 0x80000000, 0x2,0x1)

  • 小肥羊 7天前
    0 6
    SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED); 
    
    /*上述代码中,
    ES_CONTINUOUS 0x80000000  标志表示持续请求,
    ES_SYSTEM_REQUIRED 0x00000001 标志表示系统需要保持活动,
    ES_DISPLAY_REQUIRED 0x00000002 标志表示显示器需要保持开着。
    通过这些标志组合,播放器可以在播放视频时保持系统和显示器唤醒。
    */


  • cyzn_lfss 7天前
    0 7
    小肥羊 SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_ ...

    ::Kernel32.SetThreadExecutionState( 0x80000000); 

    ::Kernel32.SetThreadExecutionState( 0x00000002); 

    ::Kernel32.SetThreadExecutionState( 0x00000001); 


     像这种?

  • 光庆 7天前
    0 8
    cyzn_lfss ::Kernel32.SetThreadExecutionState( 0x80000000); ::Kernel32.SetThreadExecutionState( 0x0000 ...
    ::Kernel32.SetThreadExecutionState( 0x80000000 | 0x00000002 | 0x00000001 );
  • cyzn_lfss 7天前
    0 9

    感谢两位大佬的回复,我去试试

返回