【发布时间】: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 审计有什么问题?
-
如果可能的话,我希望对当前的问题有一个有用的答案,我将其作为一个工作项目来做,这就是我被告知这样做的方式,因为它将在内部部署,因为我们遇到了人们不接电话的问题,所以如果我们知道谁的屏幕保护程序打开或关闭,那么我们就知道谁在他们的办公桌旁,谁不在
-
还有投票问题,如果您有更好的解决方案,请分享=]
-
如果您只关心检测用户活动,我个人的意见是您最好安装一个全局输入挂钩。如果有键盘和/或鼠标活动,则假定用户在场。至少这不需要轮询。用热角击败也更难......