2009-07-10 45 views
8

Estaba buscando el mejor enfoque para averiguar si mis usuarios están inactivos en mi aplicación WPF. Actualmente, aprovecho este tiempo de inactividad del sistema operativo, y si minimizan la aplicación, y van y buscan en Internet, hay un proceso en el sistema operativo, por lo que el sistema Operativo no lo considera como tiempo de inactividad aunque no lo estén haciendo cualquier cosa dentro de la aplicación. Sin embargo, me gustaría averiguar si no han hecho clic o hacen algo dentro de mi aplicación.Obtener inactividad/tiempo de inactividad en una aplicación WPF

Así es como puedo ese tiempo de inactividad en este momento.

myApplication.MainMethod() 
    { 
     System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer(); 
     myTimer .Interval = 1000; 
     myTimer .Tick += new EventHandler(Timer_Tick); 
     myTimer .Start(); 
    } 

    void Timer_Tick(object sender, EventArgs e) 
    { 
     int idleTime= (int)Win32.GetIdleTime(); 
     if (idleTime<certainNumber) 
     { 
     //do this 
     } 
    } 
+0

Consulte [esta respuesta de StackOverflow] (http://stackoverflow.com/questions/744980/hide-mouse-cursor-after-an-idle-time/745227#745227) a otra pregunta sobre el tiempo de inactividad para una buena solución . – cdiggins

Respuesta

0

¿Cómo suscribirse a SENS eventos?

Aquí está another link.

+0

Me gustaría controlar todo internamente sin llamar/consultar un servicio externo. – paradisonoir

1

Ver esta respuesta: Application.Idle event not firing in WPF application

ComponentDispatcher.ThreadIdle es el evento que busca.

+0

+1, pero podría no ser lo que quiere la pregunta. Un usuario que está inactivo generalmente significa no usar el mouse o el teclado. El despachador también despacha cosas como un temporizador, por lo que podría estar menos inactivo de lo que piensas. –

11
public MainWindow() 
    { 
     InitializeComponent(); 
     ComponentDispatcher.ThreadIdle += new System.EventHandler(ComponentDispatcher_ThreadIdle); 
    } 

void ComponentDispatcher_ThreadIdle(object sender, EventArgs e) 
    { 
     //do your idle stuff here 
    } 
0
  1. Para tales situaciones, necesitamos un Timer que dispara hacia atrás algunos event después de un timeinterval.

  2. Y lo más importante, necesitamos un callback/eventhandler que se llama cada vez que cualquier actividad de cualquier tipo ocurre en nuestra aplicación, para que sepamos que nuestra aplicación es running.

El punto 1 puede manejarse usando DispatcherTimer.

El punto 2 se puede manejar con public event CanExecuteRoutedEventHandler CanExecute;.

Ponerlo en conjunto:

MainWindow.xaml

xmlns: cmd = "clr-espacio de nombres: System.Windows.Input; montaje = 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; 
     } 
    } 

Nos pueden ampliar fácilmente este enfoque para adaptarse a nuestras necesidades.

Cuestiones relacionadas