C# 代码实现向软件指定区域输入内容

想要使用代码向软件中的指定区域输入内容,可以使用 SendInput 函数来模拟键盘输入和鼠标操作。SendInput 函数允许发送一个或多个输入事件(如按键、释放按键、鼠标移动等)到指定的窗口。

以下是一个示例代码,演示如何使用 SendInput 函数向指定的区域发送输入:

using System;
using System.Runtime.InteropServices;
using System.Threading;

class Program
{
    // 导入 Windows API 函数
    [DllImport('user32.dll', SetLastError = true)]
    public static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

    // 输入事件结构体
    [StructLayout(LayoutKind.Sequential)]
    public struct INPUT
    {
        public uint type;
        public InputUnion u;
    }

    // 输入事件联合体
    [StructLayout(LayoutKind.Explicit)]
    public struct InputUnion
    {
        [FieldOffset(0)]
        public MOUSEINPUT mi;

        [FieldOffset(0)]
        public KEYBDINPUT ki;

        [FieldOffset(0)]
        public HARDWAREINPUT hi;
    }

    // 鼠标输入事件结构体
    [StructLayout(LayoutKind.Sequential)]
    public struct MOUSEINPUT
    {
        public int dx;
        public int dy;
        public uint mouseData;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }

    // 键盘输入事件结构体
    [StructLayout(LayoutKind.Sequential)]
    public struct KEYBDINPUT
    {
        public ushort wVk;
        public ushort wScan;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }

    // 硬件输入事件结构体
    [StructLayout(LayoutKind.Sequential)]
    public struct HARDWAREINPUT
    {
        public uint uMsg;
        public ushort wParamL;
        public ushort wParamH;
    }

    // 输入事件类型常量
    public const int INPUT_MOUSE = 0;
    public const int INPUT_KEYBOARD = 1;
    public const int INPUT_HARDWARE = 2;

    // 鼠标事件标志常量
    public const uint MOUSEEVENTF_LEFTDOWN = 0x0002;
    public const uint MOUSEEVENTF_LEFTUP = 0x0004;

    // 键盘事件标志常量
    public const uint KEYEVENTF_KEYDOWN = 0x0000;
    public const uint KEYEVENTF_KEYUP = 0x0002;

    static void Main(string[] args)
    {
        // 延迟一段时间,以便能够切换到目标窗口
        Thread.Sleep(2000);

        // 发送输入事件到目标窗口
        SendInputExample();
    }

    static void SendInputExample()
    {
        // 构造输入事件数组
        INPUT[] inputEvents = new INPUT[2];

        // 第一个事件 - 键盘按下 A 键
        inputEvents[0] = new INPUT();
        inputEvents[0].type = INPUT_KEYBOARD;
        inputEvents[0].u.ki = new KEYBDINPUT();
        inputEvents[0].u.ki.wVk = (ushort)0x41; // A 键的虚拟键码
        inputEvents[0].u.ki.dwFlags = 0;

        // 第二个事件 - 键盘释放 A 键
        inputEvents[1] = new INPUT();
        inputEvents[1].type = INPUT_KEYBOARD;
        inputEvents[1].u.ki = new KEYBDINPUT();
        inputEvents[1].u.ki.wVk = (ushort)0x41; // A 键的虚拟键码
        inputEvents[1].u.ki.dwFlags = KEYEVENTF_KEYUP;

        // 发送输入事件
        uint result = SendInput((uint)inputEvents.Length, inputEvents, Marshal.SizeOf(inputEvents[0]));

        if (result == 0)
        {
            Console.WriteLine('发送输入事件失败!');
        }
    }
}

在示例代码中,我们使用 SendInput 函数来发送输入事件。通过构造 INPUT 结构体数组来定义要发送的输入事件,可以根据需要添加更多的事件。在示例中,我们发送了按下 A 键和释放 A 键的两个键盘事件。

注意事项:

  • 在调用 SendInput 函数之前,需要确保将焦点切换到目标窗口。为了确保切换窗口的时间,我们在调用 SendInputExample 方法之前添加了一个延迟。
  • 可以根据需求进行修改,例如更改发送的输入事件类型、添加鼠标事件、发送不同的键盘按键等。
  • 请确保在应用程序中具有足够的权限来操作目标窗口和发送输入事件。
C# 代码实现向软件指定区域输入内容

原文地址: https://www.cveoy.top/t/topic/PVZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录