C# 在n秒不活动后关闭WPF应用程序

C# 在n秒不活动后关闭WPF应用程序,c#,wpf,C#,Wpf,如何在“n”秒不活动后关闭WPF应用程序?您需要定义“活动”,但基本上需要启动计时器。然后,每当有一些“活动”(无论是鼠标点击还是鼠标移动等)时,计时器就会重置 然后在计时器中,当它达到您的限制时,只需发布一个事件来调用应用程序关闭方法。中讨论了此问题。检查它,请张贴什么为你工作 我向您粘贴讨论中的代码(我认为它可以满足您的需要): 有点晚了,但我找到了这段代码,它会在任何输入事件上重新启动计时器: public partial class Window1 : Window { Di

如何在“n”秒不活动后关闭WPF应用程序?

您需要定义“活动”,但基本上需要启动计时器。然后,每当有一些“活动”(无论是鼠标点击还是鼠标移动等)时,计时器就会重置

然后在计时器中,当它达到您的限制时,只需发布一个事件来调用应用程序关闭方法。

中讨论了此问题。检查它,请张贴什么为你工作

我向您粘贴讨论中的代码(我认为它可以满足您的需要):


有点晚了,但我找到了这段代码,它会在任何输入事件上重新启动计时器:

  public partial class Window1 : Window {
    DispatcherTimer mIdle;
    private const long cIdleSeconds = 3;
    public Window1() {
      InitializeComponent();
      InputManager.Current.PreProcessInput += Idle_PreProcessInput;
      mIdle = new DispatcherTimer();
      mIdle.Interval = new TimeSpan(cIdleSeconds * 1000 * 10000);
      mIdle.IsEnabled = true;
      mIdle.Tick += Idle_Tick;
    }

    void Idle_Tick(object sender, EventArgs e) {
      this.Close();
    }

    void Idle_PreProcessInput(object sender, PreProcessInputEventArgs e) {
      mIdle.IsEnabled = false;
      mIdle.IsEnabled = true;
    }
  }

活动包括用户交互和应用程序在前台/后台线程中完成的操作。@Raj-如果您需要记录操作,那么您可能希望查看一种面向方面的方法,在所有操作方法的进入和退出时触发事件,这将重置计时器。ComponentDispatcher.ThreadIdle正在被触发正确地说,但是Dispatcher.CurrentDispatcher.Hooks.OperationPosted正在泵送事件,即使我最小化了实质上停止计时器的窗口。我最近发现了一个问题:当文本框聚焦并且鼠标在窗口上浮动时,预处理输入事件不断触发。将鼠标移到窗口外或将焦点从文本框上移开时,效果良好。这是我做错了什么吗?仅供参考:我尝试了您的解决方案,但很难准确理解何时引发
预处理输入
事件。你可以在这里找到我的问题:@Martin,我不知道,WPF对象模型太复杂了。我认为您必须仔细查看PreProcessInputEventArgs对象和转储信息,才能知道这是从哪里来的。然后,您还可以尝试对其进行过滤。感谢您的快速响应。这就是我要做的。也许我能找到答案。如果您想在预处理后启用自动注销事件,请在主窗口构造函数或窗体加载事件中保留这行代码。
  public partial class Window1 : Window {
    DispatcherTimer mIdle;
    private const long cIdleSeconds = 3;
    public Window1() {
      InitializeComponent();
      InputManager.Current.PreProcessInput += Idle_PreProcessInput;
      mIdle = new DispatcherTimer();
      mIdle.Interval = new TimeSpan(cIdleSeconds * 1000 * 10000);
      mIdle.IsEnabled = true;
      mIdle.Tick += Idle_Tick;
    }

    void Idle_Tick(object sender, EventArgs e) {
      this.Close();
    }

    void Idle_PreProcessInput(object sender, PreProcessInputEventArgs e) {
      mIdle.IsEnabled = false;
      mIdle.IsEnabled = true;
    }
  }
public MainWindow()
    {
        InitializeComponent();
        var timer = new DispatcherTimer {Interval = TimeSpan.FromSeconds(10)};
        timer.Tick += delegate
        {
            timer.Stop();
            MessageBox.Show("Logoff trigger");
            timer.Start();
        };
        timer.Start();
        InputManager.Current.PostProcessInput += delegate(object s,  ProcessInputEventArgs r)
        {
            if (r.StagingItem.Input is MouseButtonEventArgs || r.StagingItem.Input is KeyEventArgs)
                timer.Interval = TimeSpan.FromSeconds(10);
        };
    }