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