【问题标题】:Why isn't my Screensaver on/off event firing?为什么我的屏幕保护程序开/关事件没有触发?
【发布时间】:2013-06-29 14:47:36
【问题描述】:

我遇到了一个自定义事件的问题,该事件获取屏幕保护程序的开/关事件,当程序启动并且我的屏幕保护程序打开时,我的程序没有触发事件屏幕保护程序!

我的代码如下,任何和所有帮助将不胜感激=]

class ScreensaverStatusWatcher
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SystemParametersInfo(int uAction, int uParam, ref int ipvParam, int fuWinini);

        private const int screenSaverRunningStartup = -1;

        const int SPI_GETSCREENSAVERRUNNING = 114;

        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

        private bool ScreensaverStatus = false;

        private readonly System.Timers.Timer timer = new System.Timers.Timer();

        public int Interval { get; set; }

        public event EventHandler<EventArgs> ScreensaverOn;

        public event EventHandler<EventArgs> ScreensaverOff;

        public ScreensaverStatusWatcher()
        {
            timer.Interval = 1000 * 5;
            this.Initialize();
        }

        public ScreensaverStatusWatcher(int interval)
        {
            timer.Interval = interval;
            this.Initialize();
        }

        private void Initialize()
        {
            timer.Elapsed += timer_Elapsed;
        }

        public void Start()
        {
            timer.Start();
        }

        public void Stop()
        {
            timer.Stop();
        }

        public bool IsScreenSaverRunning()
        {
            int screenSaverRunning = -1;
            int ok = SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, ref screenSaverRunning, 0);

            //return - on fail
            if (ok == 0)
            {
                return false;
            }

            return (screenSaverRunning != 0);
        }

        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (!this.ScreensaverStatus && this.IsScreenSaverRunning())
            {
                this.ScreensaverStatus = true;
                this.OnScreensaverOn(new EventArgs());
            }
            else if(this.ScreensaverStatus && !this.IsScreenSaverRunning())
            {
                this.ScreensaverStatus = false;
                this.OnScreensaverOff(new EventArgs());
            }
        }

        private void OnScreensaverOn(EventArgs e)
        {
            if (this.ScreensaverOn != null)
            {
                this.ScreensaverOn(this, e);
            }            
        }

        private void OnScreensaverOff(EventArgs e)
        {
            if (this.ScreensaverOff != null)
            {
                this.ScreensaverOff(this, e);
            }
        }
    }
}

更新 这是使用这个类的代码

private ScreensaverStatusWatcher watcher = new ScreensaverStatusWatcher();

void watcher_ScreensaverOn(object sender, EventArgs e)
        {
            var data = LogDataFactory.CollectData();
            data.EventType = UserStateEvents.ScreensaverOn;

            PublishLogData(data);


        }

        void watcher_ScreensaverOff(object sender, EventArgs e)
        {
            var data = LogDataFactory.CollectData();
            data.EventType = UserStateEvents.ScreensaverOff;

            PublishLogData(data);

【问题讨论】:

  • 因为我正在制作一个日志应用程序,它将消息推送到队列,然后将这些消息转发到数据库 IE 我需要记录用户活动,所以我需要检测屏幕保护程序是否打开或关闭
  • 屏幕保护程序的开启或关闭与用户活动无关。用户可能正在远程使用机器,计算机可能处于睡眠模式,屏幕保护程序可能被禁用等等。内置的 Windows 审计有什么问题?
  • 如果可能的话,我希望对当前的问题有一个有用的答案,我将其作为一个工作项目来做,这就是我被告知这样做的方式,因为它将在内部部署,因为我们遇到了人们不接电话的问题,所以如果我们知道谁的屏幕保护程序打开或关闭,那么我们就知道谁在他们的办公桌旁,谁不在
  • 还有投票问题,如果您有更好的解决方案,请分享=]
  • 如果您只关心检测用户活动,我个人的意见是您最好安装一个全局输入挂钩。如果有键盘和/或鼠标活动,则假定用户在场。至少这不需要轮询。用热角击败也更难......

标签: c# winforms events


【解决方案1】:

除非您没有向我们展示某些代码,否则您不会在任何地方调用 Start 方法来设置计时器运行。因此,Elapsed 事件永远不会触发,因此您永远不会读取屏幕保护程序的状态。

【讨论】:

  • 好吧,如果您只是使用他们发布的代码,那么也不会创建此类的实例。在我们看到使用这个类的代码之前,它可以是任何东西。
猜你喜欢
  • 2013-04-29
  • 2016-08-24
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 2012-01-11
  • 1970-01-01
相关资源
最近更新 更多