gpt4 book ai didi

c# - 捕获所有 Windows 消息

转载 作者:可可西里 更新时间:2023-11-01 12:44:50 26 4
gpt4 key购买 nike

我想利用机器学习来模拟用户的意图,并可能自动执行常见的任务。为此,我希望能够访问大量有关用户操作和机器状态的信息。为此,我目前的想法是获得对 Windows 消息流的访问权可能是前进的方向。

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

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

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

如有任何帮助,我们将不胜感激。

最佳答案

您可以使用 SetWindowsHookEx设置低级 Hook 以捕获(特定的)Windows 消息。具体来说,这些 hook-ids 可能对监控很有趣:

WH_CALLWNDPROC (4) Installs a hook procedure that monitors messages before the system sends them to the destination window procedure. For more information, see the CallWndProc hook procedure.

WH_CALLWNDPROCRET(12) Installs a hook procedure that monitors messages after they have been processed by the destination window procedure. For more information, see the CallWndRetProc hook procedure.

我实现它已经有一段时间了,但作为示例,我已经发布了用于挂接特定消息的基类。 (例如,我在全局鼠标滚轮捕获器中使用它,确保我的 winforms 应用程序的行为与 Internet Explorer 相同:滚动光标下方的控件,而不是事件控件)。

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();
}
}


}

关于c# - 捕获所有 Windows 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11361811/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com