Capturer tous les messages Windows

Je souhaite tirer parti de l’apprentissage automatique pour modéliser les intentions d’un utilisateur et éventuellement automatiser les tâches les plus courantes. Pour ce faire, j’aimerais avoir access à un tuyau d’incendie contenant des informations sur les actions de l’utilisateur et l’état de la machine. À cette fin, je pense actuellement que l’access au stream de messages Windows est probablement la voie à suivre.

J’aimerais avoir autant d’informations que possible, filtrer les informations en fonction de celles que je souhaiterais laisser à l’outil d’apprentissage automatique.

Comment cela se ferait-il? (De préférence en C #).

Supposons que je sache gérer et utiliser ce stream important de données.

Toute aide serait grandement appréciée.

Vous pouvez utiliser SetWindowsHookEx pour définir des points d’ ancrage de bas niveau pour intercepter des messages Windows (spécifiques). Plus précisément, ces identifiants peuvent être intéressants pour la surveillance:

WH_CALLWNDPROC (4) Installe une procédure de raccordement qui surveille les messages avant que le système les envoie à la procédure de fenêtre de destination. Pour plus d’informations, consultez la procédure de hook CallWndProc.

WH_CALLWNDPROCRET (12) Installe une procédure de raccordement qui surveille les messages après leur traitement par la procédure de fenêtre de destination. Pour plus d’informations, voir la procédure de hook CallWndRetProc.

Cela fait longtemps que je ne l’ai pas implémenté, mais à titre d’exemple, j’ai posté la classe de base que j’utilise pour capturer des messages spécifiques. (Par exemple, je l’ai utilisé dans un trappeur à molette global, qui s’assure que mes applications winforms se comportent comme Internet Explorer: faites défiler le contrôle sous le curseur, au lieu du contrôle actif).

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using Subro.Win32; namespace Subro { ///  /// Base class to relatively safely register global windows hooks ///  public abstract class GlobalHookTrapper : FinalizerBase { [DllImport("user32", EntryPoint = "SetWindowsHookExA")] static extern IntPtr SetWindowsHookEx(int idHook, Delegate lpfn, IntPtr hmod, IntPtr dwThreadId); [DllImport("user32", EntryPoint = "UnhookWindowsHookEx")] private static extern int UnhookWindowsHookEx(IntPtr hHook); [DllImport("user32", EntryPoint = "CallNextHookEx")] static extern int CallNextHook(IntPtr hHook, int ncode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll")] static extern IntPtr GetCurrentThreadId(); IntPtr hook; public readonly int HookId; public readonly GlobalHookTypes HookType; public GlobalHookTrapper(GlobalHookTypes Type):this(Type,false) { } public GlobalHookTrapper(GlobalHookTypes Type, bool OnThread) { this.HookType = Type; this.HookId = (int)Type; del = ProcessMessage; if (OnThread) hook = SetWindowsHookEx(HookId, del, IntPtr.Zero, GetCurrentThreadId()); else { var hmod = IntPtr.Zero; // Marshal.GetHINSTANCE(GetType().Module); hook = SetWindowsHookEx(HookId, del, hmod, IntPtr.Zero); } if (hook == IntPtr.Zero) { int err = Marshal.GetLastWin32Error(); if (err != 0) OnHookFailed(err); } } protected virtual void OnHookFailed(int Error) { throw Win32Functions.TranslateError(Error); } private const int HC_ACTION = 0; [MarshalAs(UnmanagedType.FunctionPtr)] private MessageDelegate del; private delegate int MessageDelegate(int code, IntPtr wparam, IntPtr lparam); private int ProcessMessage(int hookcode, IntPtr wparam, IntPtr lparam) { if (HC_ACTION == hookcode) { try { if (Handle(wparam, lparam)) return 1; } catch { } } return CallNextHook(hook, hookcode, wparam, lparam); } protected abstract bool Handle(IntPtr wparam, IntPtr lparam); protected override sealed void OnDispose() { UnhookWindowsHookEx(hook); AfterDispose(); } protected virtual void AfterDispose() { } } public enum GlobalHookTypes { BeforeWindow = 4, //WH_CALLWNDPROC AfterWindow = 12, //WH_CALLWNDPROCRET KeyBoard = 2, //WH_KEYBOARD KeyBoard_Global = 13, //WH_KEYBOARD_LL Mouse = 7, //WH_MOUSE Mouse_Global = 14, //WH_MOUSE_LL JournalRecord = 0, //WH_JOURNALRECORD JournalPlayback = 1, //WH_JOURNALPLAYBACK ForeGroundIdle = 11, //WH_FOREGROUNDIDLE SystemMessages = 6, //WH_SYSMSGFILTER MessageQueue = 3, //WH_GETMESSAGE ComputerBasedTraining = 5, //WH_CBT Hardware = 8, //WH_HARDWARE Debug = 9, //WH_DEBUG Shell = 10, //WH_SHELL } public abstract class FinalizerBase : IDisposable { protected readonly AppDomain domain; public FinalizerBase() { System.Windows.Forms.Application.ApplicationExit += new EventHandler(Application_ApplicationExit); domain = AppDomain.CurrentDomain; domain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit); domain.DomainUnload += new EventHandler(domain_DomainUnload); } private bool disposed; public bool IsDisposed{get{return disposed;}} public void Dispose() { if (!disposed) { GC.SuppressFinalize(this); if (domain != null) { domain.ProcessExit -= new EventHandler(CurrentDomain_ProcessExit); domain.DomainUnload -= new EventHandler(domain_DomainUnload); System.Windows.Forms.Application.ApplicationExit -= new EventHandler(Application_ApplicationExit); } disposed = true; OnDispose(); } } void Application_ApplicationExit(object sender, EventArgs e) { Dispose(); } void domain_DomainUnload(object sender, EventArgs e) { Dispose(); } void CurrentDomain_ProcessExit(object sender, EventArgs e) { Dispose(); } protected abstract void OnDispose(); /// Destructor ~FinalizerBase() { Dispose(); } } }