如何检测不活动的用户

如何检测Windows应用程序中的非活动(空闲)用户? 我想在用户一段时间没有任何input(键盘,鼠标)的情况下closures应用程序。

Solutions Collecting From Web of "如何检测不活动的用户"

要跟踪用户的空闲时间,您可以挂钩键盘和鼠标的活动。 但是请注意,安装系统范围的消息钩子是非常有侵略性的事情,如果可能的话应该避免,因为它需要将钩子DLL加载到所有进程中。

另一个解决方案是使用GetLastInputInfo API函数(如果您的应用程序运行在Win2000(或更高版本的机器上))。 GetLastInputInfo检索上次输入事件的时间(以毫秒为单位)(当收到上次检测到的用户活动时,从键盘或鼠标)。

这是一个简单的例子。 SecondsIdle函数返回没有用户活动的SecondsIdle (在TTimer组件的OnTimer事件中调用)。

 ~~~~~~~~~~~~~~~~~~~~~~~~~ function SecondsIdle: DWord; var liInfo: TLastInputInfo; begin liInfo.cbSize := SizeOf(TLastInputInfo) ; GetLastInputInfo(liInfo) ; Result := (GetTickCount - liInfo.dwTime) DIV 1000; end; procedure TForm1.Timer1Timer(Sender: TObject) ; begin Caption := Format('System IDLE last %d seconds', [SecondsIdle]) ; end; 

http://delphi.about.com/od/adptips2004/a/bltip1104_4.htm

您可能想看到这个问题的答案: 如何判断Windows何时处于不活动状态[1]解决方案建议使用GetLastInputInfo [2] API调用基本上是同样的问题。

这篇文章解释了一些方面:( 代码项目)如何在C#中检查有无平台调用的用户不活动[3]

[1] 如何判断Windows何时不活动
[2] http://msdn.microsoft.com/en-us/library/ms646302%28VS.85%29.aspx
[3] http://www.codeproject.com/KB/cs/uim.aspx

当屏幕保护程序即将启动时,您的应用程序将获得一个WM_SYSCOMMAND消息, SC_SCREENSAVE作为一个命令ID。会这样吗? 当监视器即将空白时(也是WM_SYSCOMMAND消息),还有SC_MONITORPOWER命令ID。

编辑:看看评论,看起来你不关心用户是否是原来的,而是你的应用程序是否处于非活动状态。

这很容易。 如果您的应用程序被最小化,那么用户不会与其进行交互。 如果你的应用程序不是前台应用程序,那也是一个很好的指示器。

你也可以注意你的泵中的消息,以注意是否有任何用户输入消息到您的应用程序,在C ++中添加代码到泵是微不足道的,在delphi中,您可以使用WH_GETMESSAGE挂钩来监视泵挂钩到消息TApplication实现的循环。 或GetLastInputInfo

这SecondsIdle根本不工作。 方法是使用TTimer结合第二个变量,每当用户输入鼠标或键盘时重置。