如何识别应用程序是否在Windows中空闲

时间:2017-11-23 08:21:26

标签: c#

我知道这个问题已经被问过了 How to detect my application is idle in c# (form covered)?,等等 How to detect my application is idle in c#? 但是我找不到这些帖子中我的问题的最佳解决方案。

我有一个应用程序,如果已经过了一段时间需要注销。 我们当前正在使用getLastInput方法,它告诉上一次用户输入的滴答数。 我们从当前时间减去这个时间,并使用fromMiliseconds转换这个时间,我们检查从最后一个输入传递的时间是否大于我们的阈值,如果是,我们就会注销。

问题是getLastInput方法很快返回并且diff没有达到阈值,尽管事实上没有输入任何输入。

我认为通过Windows挂钩鼠标/键事件会很慢,因为每次输入时我们都需要重置计时器。

我很高兴听到你的想法。

2 个答案:

答案 0 :(得分:0)

据我所知,没有办法规避对用户交互的检查,但实际上你可以稍微减轻它们的负担:

using System;
using System.Windows.Forms;

namespace MyApp
{
    [SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
    public class MyForm : Form, IMessageFilter
    {
        public MyForm()
        {
            // Your code...

            InitializeComponent();

            Application.AddMessageFilter(this);
        }

        public Boolean PreFilterMessage(ref Message m)
        {
            Boolean activated = (m.Msg == 0x010) || (m.Msg == 0x0A0) || (m.Msg == 0x100) || (m.Msg == 0x101) || (m.Msg == 0x200);

            if (activated)
                // Your timer logics...

            return false;
        }
    }
}

答案 1 :(得分:0)

您可以使用System.Timers来解决您的问题。

System.Timers.Timer timer1 = new System.Timers.Timer();
            timer1.Interval = 1000;  //milliseconds after which you want to exit the application
            timer1.Start();
            timer1.Elapsed += TimerTick;

 private void TimerTick(object sender, ElapsedEventArgs e)
  {
    if (Win32.GetIdleTime() > 1000)
      {
         Environment.exit();
      }
  }