I was looking for the best approach to find out the if my users are idle in my WPF application. Currently, I take this idle time from operating system, and if they minimize
public MainWindow()
{
InitializeComponent();
ComponentDispatcher.ThreadIdle += new System.EventHandler(ComponentDispatcher_ThreadIdle);
}
void ComponentDispatcher_ThreadIdle(object sender, EventArgs e)
{
//do your idle stuff here
}
How about subscribing to SENS events?
Here's another link.
For such scenarios, we need a Timer
which fires back some event
after a timeinterval
.
And most importantly, we need a callback / eventhandler
which gets called everytime any activity of any kind happens in our application, so that we know that our application is running
.
Point 1 can be handled using DispatcherTimer
.
Point 2 can be handled using public event CanExecuteRoutedEventHandler CanExecute;
.
Putting it altogether :
MainWindow.xaml
xmlns:cmd="clr-namespace:System.Windows.Input; assembly=Presentationcore"
<!-- a do nothing button -->
<Button Command="{x:Static cmd:NavigationCommands.BrowseBack}" Visibility="Collapsed">
<Button.CommandBindings>
<!-- we can use any pre-defined / user-defined command -->
<CommandBinding Command="{x:Static cmd:NavigationCommands.BrowseBack}" CanExecute="CommandBinding_CanExecute_1"/>
</Button.CommandBindings>
</Button>
MainWindow.xaml.cs
public partial class MainWindow: Window
{
DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.ApplicationIdle);
bool running = true;
public MainWindow()
{
InitializeComponent();
timer.Interval = TimeSpan.FromSeconds(5);
timer.Tick += timer_Tick;
timer.Start();
}
private void CommandBinding_CanExecute_1(object sender, CanExecuteRoutedEventArgs e)
{
running = true;
e.CanExecute = true;
}
void timer_Tick(object sender, EventArgs e)
{
if (!running)
App.Current.Shutdown();
running = false;
}
}
We can easily extend this approach to fit our needs.
See this answer: Application.Idle event not firing in WPF application
ComponentDispatcher.ThreadIdle is the event you are looking for.