如何检测非活动用户

时间:2010-02-06 10:37:09

标签: windows delphi user-inactivity

如何在Windows应用程序中检测非活动(空闲)用户?当用户在一段时间内没有任何输入(键盘,鼠标)时,我想关闭应用程序。

4 个答案:

答案 0 :(得分:42)

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

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

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

~~~~~~~~~~~~~~~~~~~~~~~~~
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

答案 1 :(得分:9)

答案 2 :(得分:6)

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

编辑:查看评论时,您似乎并不关心用户是否为inative,而是您的应用程序是否处于非活动状态。

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

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

答案 3 :(得分:1)

This Seconds Idle根本不起作用。 方法是使用TTimer与第二个变量结合使用,每次用户输入鼠标或键盘时都会重置。