我正在try 用C#中的SendInput()来模拟鼠标和键盘事件.鼠标模拟完美,而键盘的模拟不起作用.

在这种情况下,我试图使用另一种语言来挂接键盘,以确定它是否真的可以工作,但我无法挂接任何东西.我try 查看是否有任何错误,但Marshal.GetLastWin32Error()返回0,这意味着没有错误.我也try 以管理员身份运行,但不起作用.

在那之后,我在StackOverflow上找到了similar situation,我试图将代码更改为KeyEventFlags.KEYDOWN | KeyEventFlags.SCANCODEKeyEventFlags.KEYDOWN | KeyEventFlags.UNICODE,但它们都不起作用.

代码如下:

[DllImport("user32.dll", SetLastError = true)]
public static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
KEYBDINPUT keyboardInput = new KEYBDINPUT();
keyboardInput.dwFlags = (uint)(KeyEventFlags.KEYDOWN);
keyboardInput.wVk = (ushort)'A';
    
InputUnion union = new InputUnion();
union.ki = keyboardInput;

INPUT[] input = new INPUT[1];
input[0].type = (uint)InputTypes.KEYBOARD;
input[0].U = union;
Console.WriteLine(SendInput(1, input, Marshal.SizeOf(union)));
Console.WriteLine(Marshal.GetLastWin32Error());

注:我只按下了键,但它仍然应该返回1并且已经挂钩,而它现在返回0.

下面是定义枚举的代码:

public enum InputTypes : uint
{
    MOUSE = 0,
    KEYBOARD = 1,
    HARDWARE = 2
}

public enum MouseEventFlags : uint
{
    ABSOLUTE = 0x8000,
    LEFTDOWN = 0x0002,
    LEFTUP = 0x0004,
    MIDDLEDOWN = 0x0020,
    MIDDLEUP = 0x0040,
    MOVE = 0x0001,
    RIGHTDOWN = 0x0008,
    RIGHTUP = 0x0010,
    WHEEL = 0x0800,
    XDOWN = 0x0080,
    XUP = 0x0100,
    HWHEEL = 0x01000
}

public enum KeyEventFlags : ushort
{
    KEYDOWN = 0x0000,
    EXTENDEDKEY = 0x0001,
    KEYUP = 0x0002,
    UNICODE = 0x0004,
    SCANCODE = 0x0008
}

[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;
}

我想知道为什么这不起作用,我搞错了哪一步.

推荐答案

在我看来,你需要用KEYEVENTF_KEYUP来释放密钥.

我同意Simon的观点,cbSize是输入 struct 的大小,以字节为单位.您应该使用Marshal.SizeOf(typeof(INPUT))而不是Marshal.SizeOf(union).

您可以参考以下链接:

Simulate keyboard input in C#

https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput#example

Csharp相关问答推荐

[0-n]范围内有多少个Integer在其小数表示中至少包含一个9?

我应该将新的httpReportMessage()包装在using声明中吗?

ß != ss与ICU进行不区分大小写的比较

如何从顶部提取发票号作为单词发票后的第一个匹配

为什么xslWriter不总是按照xslWriterSet中指定的格式格式化该文档?

Azure Function应用(. NET 8)不将信息记录到应用洞察

从依赖项容器在.NET 8中的Program.cs文件中添加IOC

获取具有AutoFaces的所有IOptions对象的集合

TCPClient阅读流

在.NET MAUI.NET 8中如何防止按钮点击时出现灰色反馈

使用Dapper映射联接查询对象数据到使用SplitOn;

该函数不能检测两条曲线的交点

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

链接到字典字符串.拆分为(.Key,.Value)

在implementationFactory中避免循环依赖

升级后发出SWITCH语句

WinUI 3中DoubleCollection崩溃应用程序类型的依赖属性

System.NotSupportdException:流不支持读取

如何对特定异常使用Polly重试机制?

如何在绑定到数据库的datagridview中向上或向下移动行