对用户禁用屏幕保护程序

Posted

技术标签:

【中文标题】对用户禁用屏幕保护程序【英文标题】:disabling screen saver to user 【发布时间】:2011-02-22 08:48:57 【问题描述】:

我想对其他用户禁用屏幕保护程序。怎么做?

我有管理权限。我有一个不能被屏幕保护程序中断的应用程序。

【问题讨论】:

您想为您计算机上的不同用户帐户禁用屏幕保护程序?您的帐户是否具有管理权限? 您选择了一个解决方案(禁用用户 X 的屏幕保护程序) - 这不太可能是您遇到的问题的最佳解决方案。或许你可以描述一下这个问题? 我已将您意外创建的帐户与您当前的帐户合并。请考虑在某个时候注册它,因为它开始获得声望点。 【参考方案1】:

如果您自己编写应用程序,请考虑调用非托管 API SetThreadExecutionState (PInvoke reference)。从我的回答复制到how do i prevent screen-savers and sleeps during my program execution?:

不要乱用屏保设置,使用SetThreadExecutionState。这是用于通知窗口您的应用程序处于活动状态的 API:

使应用程序能够通知 它正在使用的系统,从而 阻止系统进入 睡眠或关闭显示器,同时 应用程序正在运行。

,和

多媒体应用,例如视频 播放器和演示应用程序, 必须使用 ES_DISPLAY_REQUIRED 当他们 长时间显示视频 无需用户输入

如果您没有控制应用程序,但启动屏幕保护程序会导致问题,则将此信息推送给开发人员。

禁用屏幕保护程序几乎总是解决问题的错误方法,因为它会影响用户的整体体验,而不仅仅是在应用程序运行时。

【讨论】:

【参考方案2】:

Controlling The Screen Saver With C#

public static class ScreenSaver

   // Signatures for unmanaged calls

   [DllImport( "user32.dll", CharSet = CharSet.Auto )]
   private static extern bool SystemParametersInfo( 
      int uAction, int uParam, ref int lpvParam, 
      int flags );

   [DllImport( "user32.dll", CharSet = CharSet.Auto )]
   private static extern bool SystemParametersInfo( 
      int uAction, int uParam, ref bool lpvParam, 
      int flags );

   [DllImport( "user32.dll", CharSet = CharSet.Auto )]
   private static extern int PostMessage( IntPtr hWnd, 
      int wMsg, int wParam, int lParam );

   [DllImport( "user32.dll", CharSet = CharSet.Auto )]
   private static extern IntPtr OpenDesktop( 
      string hDesktop, int Flags, bool Inherit, 
      uint DesiredAccess );

   [DllImport( "user32.dll", CharSet = CharSet.Auto )]
   private static extern bool CloseDesktop( 
      IntPtr hDesktop );

   [DllImport( "user32.dll", CharSet = CharSet.Auto )]
   private static extern bool EnumDesktopWindows( 
      IntPtr hDesktop, EnumDesktopWindowsProc callback, 
      IntPtr lParam );

   [DllImport( "user32.dll", CharSet = CharSet.Auto )]
   private static extern bool IsWindowVisible( 
      IntPtr hWnd );

   [DllImport( "user32.dll", CharSet = CharSet.Auto )]
   public static extern IntPtr GetForegroundWindow( );

   // Callbacks

   private delegate bool EnumDesktopWindowsProc( 
      IntPtr hDesktop, IntPtr lParam );

   // Constants

   private const int SPI_GETSCREENSAVERACTIVE = 16;
   private const int SPI_SETSCREENSAVERACTIVE = 17;
   private const int SPI_GETSCREENSAVERTIMEOUT = 14;
   private const int SPI_SETSCREENSAVERTIMEOUT = 15;
   private const int SPI_GETSCREENSAVERRUNNING = 114;
   private const int SPIF_SENDWININICHANGE = 2;

   private const uint DESKTOP_WRITEOBJECTS = 0x0080;
   private const uint DESKTOP_READOBJECTS = 0x0001;
   private const int WM_CLOSE = 16;


   // Returns TRUE if the screen saver is active 

   // (enabled, but not necessarily running).

   public static bool GetScreenSaverActive( )
   
      bool isActive = false;

      SystemParametersInfo( SPI_GETSCREENSAVERACTIVE, 0, 
         ref isActive, 0 );
      return isActive;
   

   // Pass in TRUE(1) to activate or FALSE(0) to deactivate

   // the screen saver.

   public static void SetScreenSaverActive( int Active )
   
      int nullVar = 0;

      SystemParametersInfo( SPI_SETSCREENSAVERACTIVE, 
         Active, ref nullVar, SPIF_SENDWININICHANGE );
   

   // Returns the screen saver timeout setting, in seconds

   public static Int32 GetScreenSaverTimeout( )
   
      Int32 value = 0;

      SystemParametersInfo( SPI_GETSCREENSAVERTIMEOUT, 0, 
         ref value, 0 );
      return value;
   

   // Pass in the number of seconds to set the screen saver

   // timeout value.

   public static void SetScreenSaverTimeout( Int32 Value )
   
      int nullVar = 0;

      SystemParametersInfo( SPI_SETSCREENSAVERTIMEOUT, 
         Value, ref nullVar, SPIF_SENDWININICHANGE );
   

   // Returns TRUE if the screen saver is actually running

   public static bool GetScreenSaverRunning( )
   
      bool isRunning = false;

      SystemParametersInfo( SPI_GETSCREENSAVERRUNNING, 0, 
         ref isRunning, 0 );
      return isRunning;
   

   // From Microsoft's Knowledge Base article #140723: 

   // http://support.microsoft.com/kb/140723

   // "How to force a screen saver to close once started 

   // in Windows NT, Windows 2000, and Windows Server 2003"


   public static void KillScreenSaver( )
   
      IntPtr hDesktop = OpenDesktop( "Screen-saver", 0, 
         false,DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS);
      if( hDesktop != IntPtr.Zero )
      
         EnumDesktopWindows( hDesktop, new 
            EnumDesktopWindowsProc( KillScreenSaverFunc ),
            IntPtr.Zero );
         CloseDesktop( hDesktop );
      
      else
      
         PostMessage( GetForegroundWindow( ), WM_CLOSE, 
            0, 0 );
      
   

   private static bool KillScreenSaverFunc( IntPtr hWnd, 
      IntPtr lParam )
   
      if( IsWindowVisible( hWnd ) )
         PostMessage( hWnd, WM_CLOSE, 0, 0 );
      return true;
   

KillScreenSaver( )

private void KillTimer_Elapsed( object state )

   // Toggle kill state to indicate activity

   killState = ( killState == 1 ) ? 0 : 1;
   this.SetText( killState.ToString( ) );

   // Stop the screen saver if it's active and running, 

   // otherwise reset the screen saver timer.

   // Apparently it's possible for GetScreenSaverRunning()

   // to return TRUE before the screen saver has time to 

   // actually become the foreground application. So...

   // Make sure we're not the foreground window to avoid 

   // killing ourself.


   if( ScreenSaver.GetScreenSaverActive( ) )
   
      if( ScreenSaver.GetScreenSaverRunning( ) )
      
         if( ScreenSaver.GetForegroundWindow() != hThisWnd)
            ScreenSaver.KillScreenSaver( );
      
      else
      
         // Reset the screen saver timer, so the screen 

         // saver doesn't turn on until after a full

         // timeout period. If killPeriod is less than 

         // ssTimeout the screen saver should never 

         // activate.

         ScreenSaver.SetScreenSaverActive( TRUE );
      
   

【讨论】:

您是否从 link 获得了代码的精华?

以上是关于对用户禁用屏幕保护程序的主要内容,如果未能解决你的问题,请参考以下文章

如何判断屏幕保护程序是不是暂时禁用?

使用启动屏幕在通用应用程序中禁用对 iPad Pro 的支持

iOS 11 屏幕录制禁用视频录制

如何以编程方式关闭/禁用 iOS 11 中引入的屏幕截图弹出框?

在主屏幕应用程序中禁用主页按钮?

如何从 android SERVICE 禁用/启用屏幕旋转?