返回

在Windows上模拟键盘和鼠标输入事件

后端

1. 导入必要的库

在 Visual Studio 中,您需要导入以下库:

using System;
using System.Runtime.InteropServices;

2. 定义 SendInput 结构

SendInput 结构定义了要模拟的输入事件。它包含以下字段:

  • type:指定要模拟的输入类型。键盘事件的类型为 INPUT_KEYBOARD,鼠标事件的类型为 INPUT_MOUSE。
  • mi:包含键盘或鼠标事件的详细信息。
  • ki:包含键盘事件的详细信息。
  • di:包含鼠标事件的详细信息。

3. 创建 SendInput 结构

要创建 SendInput 结构,您可以使用以下代码:

[DllImport("user32.dll")]
private static extern uint SendInput(uint nInputs, SendInput[] pInputs, int cbSize);

private struct SendInput
{
    public int type;
    public MouseKeybdhardwareInputUnion mi;
}

[StructLayout(LayoutKind.Explicit)]
private struct MouseKeybdhardwareInputUnion
{
    [FieldOffset(0)]
    public MouseInputData mi;

    [FieldOffset(0)]
    public KeybdInputData ki;

    [FieldOffset(0)]
    public HardwareInputData hi;
}

[StructLayout(LayoutKind.Sequential)]
private struct MouseInputData
{
    public int dx;
    public int dy;
    public uint mouseData;
    public uint dwFlags;
    public uint time;
    public IntPtr dwExtraInfo;
}

[StructLayout(LayoutKind.Sequential)]
private struct KeybdInputData
{
    public ushort wVk;
    public ushort wScan;
    public uint dwFlags;
    public uint time;
    public IntPtr dwExtraInfo;
}

[StructLayout(LayoutKind.Sequential)]
private struct HardwareInputData
{
    public uint uMsg;
    public ushort wParamL;
    public ushort wParamH;
}

4. 设置 SendInput 结构的字段

要设置 SendInput 结构的字段,您可以使用以下代码:

SendInput si = new SendInput();
si.type = INPUT_KEYBOARD;
si.mi.ki.wVk = VK_A;
si.mi.ki.dwFlags = 0;

5. 调用 SendInput 函数

要调用 SendInput 函数,您可以使用以下代码:

SendInput(1, new SendInput[] { si }, Marshal.SizeOf(typeof(SendInput)));

这将模拟按下键盘上的“A”键。

6. 模拟鼠标输入事件

要模拟鼠标输入事件,您可以使用以下代码:

SendInput si = new SendInput();
si.type = INPUT_MOUSE;
si.mi.mi.dx = 100;
si.mi.mi.dy = 100;
si.mi.mi.mouseData = 0;
si.mi.mi.dwFlags = MOUSEEVENTF_MOVE;
SendInput(1, new SendInput[] { si }, Marshal.SizeOf(typeof(SendInput)));

这将模拟将鼠标指针移动到屏幕上的 (100, 100) 位置。