代码之家  ›  专栏  ›  技术社区  ›  Harriv

如何检测非活动用户

  •  25
  • Harriv  · 技术社区  · 14 年前

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

    4 回复  |  直到 9 年前
        1
  •  42
  •   Emerick Rogul    9 年前

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

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

    下面是一个简单的例子。这个 SecondsIdle 函数返回没有用户活动的秒数(在 OnTimer A事件 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

        3
  •  6
  •   John Knoeller    14 年前

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

    编辑:查看评论,您似乎不关心 用户 是不积极的,但更确切地说, 应用 是不活动的。

    这很容易。如果你的应用被最小化,那么用户就不会与它交互。如果你的应用不是前台应用,那也是一个很好的初始化工具。

    您还可以注意泵中的消息以通知是否有任何用户输入消息到您的应用程序中,在C++中向泵添加代码是微不足道的,在Delphi中您可以 使用Wh-getMessage钩子监视泵 钩住应用程序实现的消息循环。或GetLastinputinfo

        4
  •  1
  •   NaN    12 年前

    这第二条根本不起作用。 方法是使用一个与第二个变量相结合的TTIMER,每次用户输入鼠标或键盘时重置该变量。