Les crochets pour clavier et souris sont ce que je trouve le plus précieux. La classe ci-dessous peut être insérée et vous n'avez qu'à comprendre ce que vous voulez faire avec les informations sur les mises à jour de la clé et de la souris.
using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
namespace Example {
public class Hook {
delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
[FlagsAttribute]
public enum WindowMessage {
WM_KEYDOWN = 0x0000000000000100, // &H100
WM_MOUSEMOVE = 0x0000000000000200, // &H200
WM_LBUTTONDOWN = 0x0000000000000201, // &H201
WM_RBUTTONDOWN = 0x0000000000000204, // &H204
WH_KEYBOARD = 2,
WH_MOUSE = 7,
HC_ACTION = 0
}
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
private static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
private static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
//Declare MouseHookProcedure as a HookProc type.
static HookProc MouseHookProcedure;
static HookProc KeyboardHookProcedure;
private static int mhMouseHook = 0;
private static int mhKeyboardHook = 0;
public Hook() {}
public static void Init() {
MouseHookProcedure = new HookProc(MouseHookProc);
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
mhMouseHook = SetWindowsHookEx((int)WindowMessage.WH_MOUSE, MouseHookProcedure, (IntPtr)0, AppDomain.GetCurrentThreadId());
mhKeyboardHook = SetWindowsHookEx((int)WindowMessage.WH_KEYBOARD, KeyboardHookProcedure, (IntPtr)0, AppDomain.GetCurrentThreadId());
}
public static void Terminate() {
UnhookWindowsHookEx(mhMouseHook);
UnhookWindowsHookEx(mhKeyboardHook);
}
private static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) {
if (nCode >= 0) {
//do something here to update the last activity point, i.e. a keystroke was detected so reset our idle timer.
}
return CallNextHookEx(mhMouseHook, nCode, wParam, lParam);
}
private static int KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam) {
if (nCode >= 0) {
//do something here to update the last activity point, i.e. a mouse action was detected so reset our idle timer.
}
return CallNextHookEx(mhKeyboardHook, nCode, wParam, lParam);
}
}
}
Bien sûr, cela ne fonctionne que dans l'application que vous utilisez. Si vous devez suivre l'inactivité sur l'ensemble du système, vous devez créer une DLL qui peut être chargée dans les espaces d'adressage de toutes les autres fenêtres. Malheureusement, je n'ai entendu parler d'aucun hack qui permettrait à un .dll compilé. Net qui fonctionnera dans ce scénario; nous avons une DLL C++ qui s'accroche à cet effet.
Notez que la valeur int retournée est une valeur en secondes, qui n'est pas immédiatement claire ci-dessus. (Personnellement, j'appellerais la fonction SecondsSinceLastInput ou similaire) – Gareth
Je l'ai fait ensuite utilisé psexec pour l'envoyer à une machine distante à mon collègue. Il montre plus de 2000 secondes et augmente. Et je le vois utiliser son ordinateur, donc c'est trompeur. Il semble montrer plutôt le temps depuis que la machine a été allumée. – fjleon