C# 捕获所有Windows消息

C# 捕获所有Windows消息,c#,windows,machine-learning,messaging,C#,Windows,Machine Learning,Messaging,我想利用机器学习来模拟用户的意图,并可能自动执行通常执行的任务。要做到这一点,我想有一个消防水管的信息有关用户的行动和机器状态。为此,我目前的想法是,访问windows消息流可能是前进的方向 我希望获得尽可能多的信息,将信息过滤到我希望留给机器学习工具的相关信息 这将如何实现?(最好用C#) 请假设我知道如何管理和使用大量涌入的数据 任何帮助都将不胜感激。您可以使用设置低级挂钩来捕获(特定)windows消息。 具体来说,这些钩子ID对于监视可能很有意义: WH_CALLWNDPROC(4)安装

我想利用机器学习来模拟用户的意图,并可能自动执行通常执行的任务。要做到这一点,我想有一个消防水管的信息有关用户的行动和机器状态。为此,我目前的想法是,访问windows消息流可能是前进的方向

我希望获得尽可能多的信息,将信息过滤到我希望留给机器学习工具的相关信息

这将如何实现?(最好用C#)

请假设我知道如何管理和使用大量涌入的数据

任何帮助都将不胜感激。

您可以使用设置低级挂钩来捕获(特定)windows消息。 具体来说,这些钩子ID对于监视可能很有意义:

WH_CALLWNDPROC
(4)安装一个监视消息的钩子过程 在系统将它们发送到目标窗口程序之前。对于 更多信息,请参阅CallWndProc钩子过程

WH_CALLWNDPROCRET
(12)安装一个钩子过程来监视 由目标窗口处理后的消息 程序有关更多信息,请参阅CallWndRetProc挂钩 程序

我已经有一段时间没有实现它了,但是作为一个例子,我已经发布了用于钩住特定消息的基类。(例如,我在一个全局鼠标滚轮捕捉器中使用了它,它确保我的winforms应用程序的行为与internet explorer相同:将控件滚动到光标下方,而不是活动控件)

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Runtime.InteropServices;
使用Subro.Win32;
名称空间子程序
{
/// 
///相对安全地注册全局windows钩子的基类
/// 
公共抽象类GlobalHookTrapper:FinalizerBase
{
[DllImport(“user32”,EntryPoint=“SetWindowsHookExA”)]
静态外部IntPtr SETWINDOWSHOOKX(int idHook、委托lpfn、IntPtr hmod、IntPtr dwThreadId);
[DllImport(“user32”,EntryPoint=“unhookwindowshookx”)]
私有静态外部程序int unhookwindowshookx(IntPtr hHook);
[DllImport(“user32”,EntryPoint=“CallNextHookEx”)]
静态外部int CallNextHook(IntPtr hHook、int ncode、IntPtr wParam、IntPtr lParam);
[DllImport(“kernel32.dll”)]
静态外部IntPtr GetCurrentThreadId();
IntPtr钩;
公共只读int-HookId;
公共只读全局钩子类型钩子类型;
公共GlobalHookTrapper(GlobalHookTypes类型):此(类型,false)
{
}
公共全局钩子捕捉器(全局钩子类型,bool-OnThread)
{
this.HookType=Type;
this.HookId=(int)类型;
del=ProcessMessage;
如果(阅读)
hook=SetWindowsHookEx(HookId,del,IntPtr.Zero,GetCurrentThreadId());
其他的
{
var hmod=IntPtr.Zero;//Marshal.GetHINSTANCE(GetType().Module);
hook=SetWindowsHookEx(HookId、del、hmod、IntPtr.Zero);
}
if(hook==IntPtr.Zero)
{
int err=Marshal.GetLastWin32Error();
如果(错误!=0)
onhook失败(err);
}
}
受保护的虚拟void OnHookFailed(int错误)
{
抛出Win32Functions.TranslateError(错误);
}
私有const int HC_ACTION=0;
[Marshallas(UnmanagedType.FunctionPtr)]
私信;
私有委托int MessageDelegate(int代码、IntPtr wparam、IntPtr lparam);
私有int-ProcessMessage(int-hookcode、IntPtr-wparam、IntPtr-lparam)
{
如果(HC_动作==钩码)
{
尝试
{
if(Handle(wparam,lparam))返回1;
}
捕获{}
}
返回CallNextHook(hook、hookcode、wparam、lparam);
}
受保护的抽象布尔句柄(IntPtr wparam、IntPtr lparam);
受保护的覆盖密封无效OnDispose()
{
解开钩(钩);
后处理();
}
受保护的虚拟空间AfterDispose()
{
}
}
公共枚举全局钩子类型
{
BeforeWindow=4,//WH_CALLWNDPROC
AfterWindow=12,//WH\u调用WndProcret
键盘=2,//WH\u键盘
键盘\u全局=13,//WH\u键盘\u LL
鼠标=7,//WH\u鼠标
鼠标\u全局=14,//WH\u鼠标\u LL
JournalRecord=0,//WH\u JournalRecord
JournalPlayback=1,//WH\u JournalPlayback
ForeGroundIdle=11,//WH\u ForeGroundIdle
SystemMessages=6,//WH\u SYSMSGFILTER
MessageQueue=3,//WH\u GETMESSAGE
基于计算机的培训=5,//WH\u CBT
硬件=8,//WH\u硬件
Debug=9,//WH\u Debug
Shell=10,//WH\u Shell
}
公共抽象类终结器基:IDisposable
{
受保护的只读AppDomain域;
公共终结器基()
{
System.Windows.Forms.Application.ApplicationExit+=新事件处理程序(Application\u ApplicationExit);
domain=AppDomain.CurrentDomain;
domain.ProcessExit+=新的事件处理程序(CurrentDomain_ProcessExit);
domain.DomainUnload+=新的事件处理程序(domain\u DomainUnload);
}
私人住宅;
public bool IsDisposed{get{return disposed;}}
公共空间处置()
{
如果(!已处置)
{
总干事(本);
如果(域!=null)
{
domain.ProcessExit-=新的事件处理程序(CurrentDomain\u ProcessExit);
domain.DomainUnload-=新事件处理程序(域\域
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using Subro.Win32;

namespace Subro
{
    /// <summary>
    /// Base class to relatively safely register global windows hooks
    /// </summary>
    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();
        }
    }


}