65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows 应用程序内的自动注销

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.29/5 (10投票s)

2008 年 1 月 14 日

CPOL

2分钟阅读

viewsIcon

89825

downloadIcon

3074

一个简单、封装的组件,用于检测 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 日 -- 更新下载内容。
© . All rights reserved.