Comment vérifier s’il n’y a aucune entrée du clavier ou de la souris pendant une période en C #

J’essaie d’écrire une ligne de code qui vérifie s’il n’y a aucune entrée du clavier et de la souris et si la position de la souris ne change pas pendant une minute. Si cette condition est vraie, déclenchez un événement:

if ((no_Keyboard_input) && (no_mouse_input) && (no_change_in_mousePosition)) { start_timer; if (time_elapsed == 1 min) { playAnimation; } } 

En utilisant l’API, voici une méthode que j’avais utilisée auparavant:

 [DllImport("user32.dll")] public static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); [DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern int GetTickCount(); [StructLayout(LayoutKind.Sequential)] public struct LASTINPUTINFO { public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO)); [MarshalAs(UnmanagedType.U4)] public int cbSize; [MarshalAs(UnmanagedType.U4)] public UInt32 dwTime; } 

Comment l’utiliser:

 public static TimeSpan GetIdleTime() { TimeSpan idleTime = TimeSpan.FromMilliseconds(0); LASTINPUTINFO lastInputInfo = new LASTINPUTINFO(); lastInputInfo.cbSize = Marshal.SizeOf(lastInputInfo); lastInputInfo.dwTime = 0; if (GetLastInputInfo(ref lastInputInfo)) { idleTime = TimeSpan.FromMilliseconds(GetTickCount() - (lastInputInfo.dwTime & uint.MaxValue)); //idleTime = TimeSpan.FromSeconds(Convert.ToInt32(lastInputInfo.dwTime / 1000)); } return idleTime; } 

Modifier: ajoutez la signature de l’API GetTickCount() .

Je regarderais les extensions réactives pour quelque chose comme ça. Ils fournissent un moyen agréable de composer de nombreux événements différents en un seul événement, ainsi que la syntaxe agréable de LINQ.

Le code ci-dessous n’a pas été testé, mais donne une idée de la façon dont vous pourriez le faire.

 DateTime lastKeyboardInput, lastMouseInput; var mouse = Observable.FromEvent(MouseDown); var keyboard = Observable.FromEvent(KeyPress); var seconds = Observable.Timer(TimeSpan.FromSeconds(1)); mouse.Subscribe(m => lastMouseInput = DateTime.Now()); keyboard.Subscribe(k => lastKeyboardInput = DateTime.Now()); var myEvent = from tick in seconds where lastKeyboardEvent < DateTime.Now() - TimeSpan.FromSeconds(60) where lastMouseEvent < DateTime.Now() - TimeSpawn.FromSeconds(60) select tick; myEvent.Subscribe(t => playAnimation());