30

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

4

4 回答 4

49

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

另一种解决方案是使用GetLastInputInfoAPI 函数(如果您的应用程序在 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

于 2010-02-06T10:55:29.197 回答
11

您可能希望看到这个问题的答案:如何判断 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

于 2010-02-06T10:45:10.713 回答
7

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

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

这很简单。如果您的应用程序已最小化,则用户不会与它进行交互。如果您的应用程序不是前台应用程序,那也是一个很好的指标。

您还可以注意泵中的消息以注意是否有任何用户输入消息到您的应用程序中TApplication 实现的循环。或 GetLastInputInfo

于 2010-02-06T10:39:55.967 回答
3

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

于 2012-04-13T15:07:43.230 回答