Windows 应用程序内的自动注销






4.29/5 (10投票s)
一个简单、封装的组件,用于检测 Windows Forms 应用程序是处于活动状态还是空闲状态。
引言
请记住,这段代码没有经过大量的测试,可能包含错误。另外,我在使用 Windows 消息编程方面还比较新手,所以请不要过于苛责。
背景
最近,我被要求在一个现有的 Windows 桌面应用程序中添加“自动注销”功能。这似乎不是什么大事,但当我坐下来思考时,我意识到这将需要很多工作。原因是,所讨论的桌面应用程序有很多不同的模式窗体,并且每个窗体都与其他窗体有很大差异,而且……重点是,尝试对所有会让我们认为应用程序“处于活动状态”的事件进行临时事件处理将是极其混乱的。
在我的研究初期,我发现有人建议研究 Windows 钩子。我不太了解钩子(说实话,现在仍然不太了解),所以这看起来有点吓人。但我找到了一些好的参考实现,将它们组合在一起,并进行了一些调整。我想现在是时候记录这些代码片段了。
- 虽然我没有使用低级钩子,但我在 Steven Toub 的博客上找到的代码很有用。
- 此外,我从一个 Windows KB 页面上学到很多。
Using the Code
活动监视器对象是一个可释放对象,可以在您想要的任何范围内声明。在附带的演示应用程序中,它被声明为主窗体的成员
ActivityMonitor.ActivityMonitor _am = new ActivityMonitor.ActivityMonitor();
然后在构造函数中初始化它
_am.WarningMinutes = 0.9;
_am.MaxMinutesIdle = 1;
_am.Idle += new EventHandler(am_Idle);
...其中 am_Idle
是应用程序变为空闲状态时的处理程序
void am_Idle(object sender, EventArgs e)
{
Application.Exit();
}
关注点
我遇到的一些问题是,我的小组件即使在鼠标没有进行任何操作(没有移动或点击)时也会拦截 Windows 鼠标消息。我最终注意到,当鼠标悬停在我的窗体上时,它们似乎会被触发。对我来说,这不算作处于活动状态,所以我通过仅拦截“点击”消息来解决这个问题
private int MouseHookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
MouseMessages mouseInfo = (MouseMessages)wParam;
if (nCode >= 0 &&
((mouseInfo == MouseMessages.WM_LBUTTONDOWN) || (
mouseInfo == MouseMessages.WM_RBUTTONDOWN)))
_lastActivity = DateTime.Now;
return CallNextHookEx(_mouseHookID, nCode, wParam, lParam);
}
无论如何,我欢迎任何反馈,并希望有人能发现这对我有所帮助。
历史
- 2008 年 1 月 14 日 -- 发布原始版本。
- 2008 年 1 月 18 日 -- 更新下载内容。