Poniżej znajduje się fragment kodu, którego używam do symulacji naciśnięć klawiszy za pośrednictwem interfejsu SendInput API. Działa to poprawnie, jeśli ustawię moją aplikację na kompilację dla procesora x86, ale nie działa to przy kompilacji CPU x64.SendInput and 64bits
Zgaduję, że ma coś todo z tym, że x64 używa wskaźników podwójnego rozmiaru, ale próbowałem zmienić ten [FieldOffset(4)]
na ten [FieldOffset(8)]
, ale to nie zadziałało.
Czy może to mieć coś wspólnego z faktem, że importuje on 32-bitową wersję 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]));
}
Jakoś niektóre kod brakowało więc linia powinna czytać '[StructLayout (LayoutKind.Explicit, Size = 28)]' – Cheetah