How do I shutdown a WPF application after 'n' seconds of inactivity?
+1
A:
You'll need to define "activity", but basically you want to start a timer. Then every time there is some "activity" (whether it's mouse clicks or mouse moves etc.) the timer is reset.
Then in the timer when it reaches your limit just post an event to call the application close method.
ChrisF
2010-03-02 12:45:23
Activities include user interaction and operation done by application in foreground/background thread.
Raj
2010-03-02 12:53:12
@Raj - if you need to log operations then you might want to look at an aspect orientated approach where you fire an event on entry and exit from all operational methods which would reset the timer.
ChrisF
2010-03-02 12:55:59
A:
Hi!
There was a discussion in msdn social about this matter. Check it and please post what did work for you....
I paste you the code from the discussion (the one I think it will do what you need):
public partial class Window1 : Window
{
private EventHandler handler;
public Window1()
{
InitializeComponent();
handler = delegate
{
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(4);
timer.Tick += delegate
{
if (timer != null)
{
timer.Stop();
timer = null;
System.Windows.Interop.ComponentDispatcher.ThreadIdle -= handler;
MessageBox.Show("You get caught!");
System.Windows.Interop.ComponentDispatcher.ThreadIdle += handler;
}
};
timer.Start();
//System.Windows.Interop.ComponentDispatcher.ThreadIdle -= handler;
Dispatcher.CurrentDispatcher.Hooks.OperationPosted += delegate
{
if (timer != null)
{
timer.Stop();
timer = null;
}
};
};
ComponentDispatcher.ThreadIdle += handler;
}
}
jmservera
2010-03-02 13:01:20
ComponentDispatcher.ThreadIdle is getting fired properly, but Dispatcher.CurrentDispatcher.Hooks.OperationPosted is pumping events even if I minimize the Window that essentially stop timer.
Raj
2010-03-02 13:27:50
+2
A:
A bit late, but I came up with this code, it restarts a timer on any input event:
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;
}
}
Hans Passant
2010-03-02 13:28:13
There is one problem I found recently: When a textbox is focused and the mouse is floating over the window, the PreProcessInput-event is constantly firing. When you move the mouse outside the window or take the focus off of the textbox, it works fine. Is this me doing something wrong?
PVitt
2010-07-29 09:22:16