[DllImport("user32.dll", SetLastError = true)]
private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
[DllImport("user32.dll")]
private static extern short VkKeyScan(char ch);
[StructLayout(LayoutKind.Sequential)]
private struct KEYBDINPUT
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public uint time;
public nint dwExtraInfo;
}
[StructLayout(LayoutKind.Explicit)]
private struct InputUnion
{
[FieldOffset(0)] public KEYBDINPUT ki;
}
[StructLayout(LayoutKind.Explicit)]
private struct INPUT
{
[FieldOffset(0)] public uint type;
[FieldOffset(4)] public InputUnion U;
}
private static void SendKey(ushort vkCode, uint flags)
{
var input = new INPUT
{
type = 1,
U = new InputUnion
{
ki = new KEYBDINPUT
{
wVk = vkCode,
wScan = 0,
dwFlags = flags,
time = 0,
dwExtraInfo = 0
}
}
};
uint result = SendInput(1, [input], Marshal.SizeOf<INPUT>());
if (result == 0)
{
int error = Marshal.GetLastWin32Error();
Console.WriteLine($"error: {error}");
}
}
[DllImport("user32.dll", SetLastError = true)]
private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
[DllImport("user32.dll")]
private static extern short VkKeyScan(char ch);
[StructLayout(LayoutKind.Sequential)]
private struct KEYBDINPUT
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public uint time;
public nint dwExtraInfo;
}
[StructLayout(LayoutKind.Explicit)]
private struct InputUnion
{
[FieldOffset(0)] public KEYBDINPUT ki;
}
[StructLayout(LayoutKind.Explicit)]
private struct INPUT
{
[FieldOffset(0)] public uint type;
[FieldOffset(4)] public InputUnion U;
}
private static void SendKey(ushort vkCode, uint flags)
{
var input = new INPUT
{
type = 1,
U = new InputUnion
{
ki = new KEYBDINPUT
{
wVk = vkCode,
wScan = 0,
dwFlags = flags,
time = 0,
dwExtraInfo = 0
}
}
};
uint result = SendInput(1, [input], Marshal.SizeOf<INPUT>());
if (result == 0)
{
int error = Marshal.GetLastWin32Error();
Console.WriteLine($"error: {error}");
}
}