【问题标题】:How to detect inactive user如何检测非活动用户
【发布时间】:2011-01-13 20:16:45
【问题描述】:

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

【问题讨论】:

  • 约翰给了你有用的答案。我的问题是:为什么?!如果我是一个用户并且我正在使用一个程序,我去吃午饭然后回来,如果它消失了,我不会是一个快乐的露营者。如果您不想让它们保持打开状态或其他什么,请关闭资源,但不要关闭程序;让用户知道发生了什么!
  • @T.J. Crowder:虽然我同意用户反馈很重要,但它可能不是像应用程序之类的普通办公室。我们不知道该计划的性质或其目标受众。在一定的空闲时间后关闭该程序及其特定用途可能是有意义的。问题是如何检测空闲时间,由于没有迹象表明我们在这里处理什么样的程序,我认为反对它是不公平的。 :)
  • @T.J. Crowder:TommyA 走上正轨,这不是普通的办公应用,甚至不是办公环境。基本上我有不时使用的客户端应用程序(应用程序总是在运行),我想远程更新它们。它需要重新启动应用程序,但我不想打扰用户,所以如果用户正在做某事,我打算等待几分钟。
  • 在这种特殊情况下,您可能希望做的是,当您注意到不活动时,显示一个框,倒计时 30 秒或类似的东西,让用户有机会中止关机.
  • @LightnessRacesinOrbit:这不是常规的桌面环境。

标签: windows delphi user-inactivity


【解决方案1】:

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

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

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

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

【讨论】:

  • 从来没有用户使用屏幕保护程序。
  • 屏幕保护程序在这个特定的应用程序中被禁用,所以运气不好。
  • +1,但不需要WH_GETMESSAGE钩子,只需钩入TApplication实现的消息循环即可。
【解决方案2】:
【解决方案3】:

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

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

这是一个简单的例子。 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

【讨论】:

  • 注意:此 API 是系统范围的,而不是特定于应用程序的。
【解决方案4】:

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

【讨论】:

  • 欺负太多了,嗯? :D
  • “不起作用”意味着 SecondsIdle/GetLastInputInfo 返回的值是系统范围的,而不是特定于应用程序的。关于这一点,OP 问题似乎是关于应用程序空闲(无论如何不确定),而不是系统空闲,我做了 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2021-05-10
  • 2011-05-11
  • 1970-01-01
  • 2018-07-21
相关资源
最近更新 更多