32/64 XP, , . pInvoke, .
, -, , . , , . 64- 32-.
internal static class SendInputExternalCalls
{
[DllImport("user32.dll", SetLastError = true, EntryPoint = "SendInput")]
public static extern UInt32 SendInput(
UInt32 numInputs,
[MarshalAs(UnmanagedType.LPArray, SizeConst = 1)]
SEND_INPUT_FOR_32_BIT[] sendInputsFor,
Int32 cbSize);
[DllImport("user32.dll", SetLastError = true, EntryPoint = "SendInput")]
public static extern UInt32 SendInput(
UInt32 numInputs,
[MarshalAs(UnmanagedType.LPArray, SizeConst = 1)]
SEND_INPUT_FOR_64_BIT[] sendInputsFor,
Int32 cbSize);
}
[StructLayout(LayoutKind.Explicit, Pack = 1)]
internal struct SEND_INPUT_FOR_32_BIT
{
[FieldOffset(0)]
public uint InputType;
[FieldOffset(4)]
public KEYBOARD_INPUT_FOR_32_BIT KeyboardInputStruct;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct KEYBOARD_INPUT_FOR_32_BIT
{
public ushort VirtualKeyCode;
public ushort ScanCode;
public uint Flags;
public uint Time;
public uint ExtraInfo;
public uint Padding1;
public uint Padding2;
}
[StructLayout(LayoutKind.Explicit, Pack = 1)]
internal struct SEND_INPUT_FOR_64_BIT
{
[FieldOffset(0)]
public uint InputType;
[FieldOffset(8)]
public KEYBOARD_INPUT_FOR_64_BIT KeyboardInputStruct;
}
[StructLayout(LayoutKind.Explicit, Pack = 1)]
internal struct KEYBOARD_INPUT_FOR_64_BIT
{
[FieldOffset(0)]
public ushort VirtualKeyCode;
[FieldOffset(2)]
public ushort ScanCode;
[FieldOffset(4)]
public uint Flags;
[FieldOffset(12)]
public uint Time;
[FieldOffset(20)]
public uint Padding1;
[FieldOffset(28)]
public uint Padding2;
}
. . 32 64- , 32- 64- Windows. , 32- SendInput 64- , , . , , .
public static void SendInput( ushort charUnicode )
{
if (Marshal.SizeOf(new IntPtr()) == 8)
{
SendInput64(charUnicode);
}
else
{
SendInput32(charUnicode);
}
}
Vista, 32/64 Windows XP 32/64 Windows 7.