A continuación se muestra un extracto de algún código que estoy usando para simular pulsaciones de teclas a través de SendInput API. Esto funciona correctamente si configuro mi aplicación para compilar para una CPU x86, pero no funciona para la compilación de la CPU x64.SendInput y 64bits
Supongo que tiene algo que ver con el hecho de que x64 usa punteros de tamaño doble, pero traté de cambiar este [FieldOffset(4)]
a este [FieldOffset(8)]
pero no funcionó.
¿Podría ser algo relacionado con el hecho de que está importando la versión de 32 bits de user32.dll?
#region SendInput API
[DllImport("user32.dll", EntryPoint = "SendInput", SetLastError = true)]
static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
[DllImport("user32.dll", EntryPoint = "GetMessageExtraInfo", SetLastError = true)]
static extern IntPtr GetMessageExtraInfo();
private enum KeyEvent
{
KeyUp = 0x0002,
KeyDown = 0x0000,
ExtendedKey = 0x0001
}
private struct KEYBDINPUT
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public long time;
public uint dwExtraInfo;
};
[StructLayout(LayoutKind.Explicit, Size = 28)]
private struct INPUT
{
[FieldOffset(0)]
public uint type;
[FieldOffset(4)]
public KEYBDINPUT ki;
};
#endregion
public void sendKey(KeyCode Key)
{
INPUT[] InputList = new INPUT[2];
INPUT keyInput = new INPUT();
keyInput.type = 1;
keyInput.ki.wScan = 0;
keyInput.ki.time = 0;
keyInput.ki.dwFlags = (int)KeyEvent.KeyDown;
keyInput.ki.dwExtraInfo = (uint)GetMessageExtraInfo();
keyInput.ki.wVk = (ushort)Key;
InputList[0] = keyInput;
keyInput.ki.dwFlags = (int)KeyEvent.KeyUp;
InputList[1] = keyInput;
SendInput((uint)2, InputList, Marshal.SizeOf(InputList[0]));
}
De algún modo, algo de código que faltaba por lo que la línea en cuestión deberá leer '[StructLayout (LayoutKind.Explicit, Tamaño = 28)]' – Cheetah