C# 在内核空间中模拟鼠标单击
我试图在内核空间中模拟键盘和鼠标的点击,这样它们就不能在其他应用程序中被阻止(与用户空间模拟相反) 为了实现这个目标,我找到了一个库,它是 项目 据我所知,它安装了一个驱动程序来与鼠标和键盘等硬件设备进行通信。 然而,与完美工作的键盘模拟不同,我无法使鼠标模拟工作: 没有右键或左键单击,只有鼠标移动在工作 这是驱动程序包装代码:C# 在内核空间中模拟鼠标单击,c#,windows,winapi,mouse,C#,Windows,Winapi,Mouse,我试图在内核空间中模拟键盘和鼠标的点击,这样它们就不能在其他应用程序中被阻止(与用户空间模拟相反) 为了实现这个目标,我找到了一个库,它是 项目 据我所知,它安装了一个驱动程序来与鼠标和键盘等硬件设备进行通信。 然而,与完美工作的键盘模拟不同,我无法使鼠标模拟工作: 没有右键或左键单击,只有鼠标移动在工作 这是驱动程序包装代码: using System; using System.Collections.Generic; using System.Linq; using System.Runt
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace Interceptor
{
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int Predicate(int device);
[Flags]
public enum KeyState : ushort
{
Down = 0x00,
Up = 0x01,
E0 = 0x02,
E1 = 0x04,
TermsrvSetLED = 0x08,
TermsrvShadow = 0x10,
TermsrvVKPacket = 0x20
}
[Flags]
public enum KeyboardFilterMode : ushort
{
None = 0x0000,
All = 0xFFFF,
KeyDown = KeyState.Up,
KeyUp = KeyState.Up << 1,
KeyE0 = KeyState.E0 << 1,
KeyE1 = KeyState.E1 << 1,
KeyTermsrvSetLED = KeyState.TermsrvSetLED << 1,
KeyTermsrvShadow = KeyState.TermsrvShadow << 1,
KeyTermsrvVKPacket = KeyState.TermsrvVKPacket << 1
}
[Flags]
public enum MouseState : ushort
{
LeftDown = 0x01,
LeftUp = 0x02,
RightDown = 0x04,
RightUp = 0x08,
MiddleDown = 0x10,
MiddleUp = 0x20,
LeftExtraDown = 0x40,
LeftExtraUp = 0x80,
RightExtraDown = 0x100,
RightExtraUp = 0x200,
ScrollVertical = 0x400,
ScrollUp = 0x400,
ScrollDown = 0x400,
ScrollHorizontal = 0x800,
ScrollLeft = 0x800,
ScrollRight = 0x800,
}
[Flags]
public enum MouseFilterMode : ushort
{
None = 0x0000,
All = 0xFFFF,
LeftDown = 0x01,
LeftUp = 0x02,
RightDown = 0x04,
RightUp = 0x08,
MiddleDown = 0x10,
MiddleUp = 0x20,
LeftExtraDown = 0x40,
LeftExtraUp = 0x80,
RightExtraDown = 0x100,
RightExtraUp = 0x200,
MouseWheelVertical = 0x400,
MouseWheelHorizontal = 0x800,
MouseMove = 0x1000,
}
[Flags]
public enum MouseFlags : ushort
{
MoveRelative = 0x000,
MoveAbsolute = 0x001,
VirtualDesktop = 0x002,
AttributesChanged = 0x004,
MoveWithoutCoalescing = 0x008,
TerminalServicesSourceShadow = 0x100
}
[StructLayout(LayoutKind.Sequential)]
public struct MouseStroke
{
public MouseState State;
public MouseFlags Flags;
public Int16 Rolling;
public Int32 X;
public Int32 Y;
public UInt16 Information;
}
[StructLayout(LayoutKind.Sequential)]
public struct KeyStroke
{
public Keys Code;
public KeyState State;
public UInt32 Information;
}
[StructLayout(LayoutKind.Explicit)]
public struct Stroke
{
[FieldOffset(0)] public MouseStroke Mouse;
[FieldOffset(0)] public KeyStroke Key;
}
/// <summary>
/// The .NET wrapper class around the C++ library interception.dll.
/// </summary>
public static class InterceptionDriver
{
[DllImport("interception.dll", EntryPoint = "interception_create_context", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr CreateContext();
[DllImport("interception.dll", EntryPoint = "interception_destroy_context", CallingConvention = CallingConvention.Cdecl)]
public static extern void DestroyContext(IntPtr context);
[DllImport("interception.dll", EntryPoint = "interception_get_precedence", CallingConvention = CallingConvention.Cdecl)]
public static extern void GetPrecedence(IntPtr context, Int32 device);
[DllImport("interception.dll", EntryPoint = "interception_set_precedence", CallingConvention = CallingConvention.Cdecl)]
public static extern void SetPrecedence(IntPtr context, Int32 device, Int32 Precedence);
[DllImport("interception.dll", EntryPoint = "interception_get_filter", CallingConvention = CallingConvention.Cdecl)]
public static extern void GetFilter(IntPtr context, Int32 device);
[DllImport("interception.dll", EntryPoint = "interception_set_filter", CallingConvention = CallingConvention.Cdecl)]
public static extern void SetFilter(IntPtr context, Predicate predicate, Int32 keyboardFilterMode);
[DllImport("interception.dll", EntryPoint = "interception_wait", CallingConvention = CallingConvention.Cdecl)]
public static extern Int32 Wait(IntPtr context);
[DllImport("interception.dll", EntryPoint = "interception_wait_with_timeout", CallingConvention = CallingConvention.Cdecl)]
public static extern Int32 WaitWithTimeout(IntPtr context, UInt64 milliseconds);
[DllImport("interception.dll", EntryPoint = "interception_send", CallingConvention = CallingConvention.Cdecl)]
public static extern Int32 Send(IntPtr context, Int32 device, ref Stroke stroke, UInt32 numStrokes);
[DllImport("interception.dll", EntryPoint = "interception_receive", CallingConvention = CallingConvention.Cdecl)]
public static extern Int32 Receive(IntPtr context, Int32 device, ref Stroke stroke, UInt32 numStrokes);
[DllImport("interception.dll", EntryPoint = "interception_get_hardware_id", CallingConvention = CallingConvention.Cdecl)]
public static extern Int32 GetHardwareId(IntPtr context, Int32 device, String hardwareIdentifier, UInt32 sizeOfString);
[DllImport("interception.dll", EntryPoint = "interception_is_invalid", CallingConvention = CallingConvention.Cdecl)]
public static extern Int32 IsInvalid(Int32 device);
[DllImport("interception.dll", EntryPoint = "interception_is_keyboard", CallingConvention = CallingConvention.Cdecl)]
public static extern Int32 IsKeyboard(Int32 device);
[DllImport("interception.dll", EntryPoint = "interception_is_mouse", CallingConvention = CallingConvention.Cdecl)]
public static extern Int32 IsMouse(Int32 device);
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Runtime.InteropServices;
使用系统文本;
名称空间拦截器
{
[非托管函数指针(CallingConvention.Cdecl)]
公共委托int谓词(int设备);
[旗帜]
公共枚举键状态:ushort
{
向下=0x00,
Up=0x01,
E0=0x02,
E1=0x04,
TermsrvSetLED=0x08,
TermsrvShadow=0x10,
TermsrvVKPacket=0x20
}
[旗帜]
公用枚举键盘筛选器模式:ushort
{
无=0x0000,
All=0xFFFF,
KeyDown=KeyState.Up,
我弄明白了-在我使用的库中,鼠标设备id硬编码为12,这是完全错误的
现在它像一个符咒一样被扭曲:)对于任何不能发送鼠标点击的人,
尝试进入Inteceptor.sendMouseeEvent方法
排队
InterceptionDriver.Send(context, 12, ref stroke, 1);
将12改为11,因此现在该行如下所示
InterceptionDriver.Send(context, 11, ref stroke, 1);
@DavidHeffernan你应该为你的指责感到羞耻。你应该成为理解他人特殊需求的障碍。我们这里有无数的问题来自试图击败在线扑克应用程序的人。它确实有点磨损。你想击败什么应用程序?@DavidHeffernan我将学习安全作为一种爱好,我将IDA Pro作为一种工具工具,但它阻止了常规的“发送输入”方法,因此我必须尝试驱动程序空间模拟方法。您是否已将硬编码值更改为驱动程序回调上接收的设备id值以使其正常工作?
InterceptionDriver.Send(context, 11, ref stroke, 1);