title: SendInput and 64bits
body: <p>Below is an extract of some code I am using to simulate key presses via the SendInput API. This works correctly if I set my application to compile for an x86 CPU, but doesn't work for x64 CPU compilation.</p>
  
  <p>I'm guessing it has something todo with the fact that x64 uses double size pointers, but I tried to change this <code>[FieldOffset(4)]</code> to this <code>[FieldOffset(8)]</code> but it didn't work.</p>
  
  <p>Could it be something to do with the fact it is importing the 32bit version of user32.dll?</p>
  
  <pre><code>    #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]));
      }
  </code></pre>