SendInput在64位上失败

可能重复:
SendInput和64位

我正在使用.NET代码中的SendInput(PInvoke)。
用于在32位操作系统上正常工作的代码,但现在在WIN7上SendInput返回0,最后一个错误设置为57(ERROR_INVALID_PARAMETER)。
我无法将代码编译为x86,因为我已加载到64位主机中。 此外,我尝试了各种有关结构尺寸和场偏移的解决方案,但都没有。
这些是我的PInvoke导入和类型:

[StructLayout(LayoutKind.Sequential)] struct KEYBOARD_INPUT { public uint type; public ushort vk; public ushort scanCode; public uint flags; public uint time; public uint extrainfo; public uint padding1; public uint padding2; } [DllImport("User32.dll", SetLastError=true)] private static extern uint SendInput( uint numberOfInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] KEYBOARD_INPUT[] input, int structSize); 

和代码用法是:

 uint result = SendInput( (uint)inputs.Count, inputs.ToArray(), Marshal.SizeOf(inputs[0])); 

其中inputs数组包含1个KEYBOARD_INPUT结构。
这得到结果= 0,当我检查上一个错误时,我得到的最后一个错误设置为57(ERROR_INVALID_PARAMETER,参数不正确)。

有没有办法让这个工作在WIN7 64位操作系统的64位主机下工作? 这适用于XP …

谢谢

尝试使用以下定义(由pinvoke.net提供 ):

 const int INPUT_MOUSE = 0; const int INPUT_KEYBOARD = 1; const int INPUT_HARDWARE = 2; const uint KEYEVENTF_EXTENDEDKEY = 0x0001; const uint KEYEVENTF_KEYUP = 0x0002; const uint KEYEVENTF_UNICODE = 0x0004; const uint KEYEVENTF_SCANCODE = 0x0008; struct INPUT { public int type; public InputUnion u; } [StructLayout(LayoutKind.Explicit)] struct InputUnion { [FieldOffset(0)] public MOUSEINPUT mi; [FieldOffset(0)] public KEYBDINPUT ki; [FieldOffset(0)] public HARDWAREINPUT hi; } [StructLayout(LayoutKind.Sequential)] struct MOUSEINPUT { public int dx; public int dy; public uint mouseData; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] struct KEYBDINPUT { /*Virtual Key code. Must be from 1-254. If the dwFlags member specifies KEYEVENTF_UNICODE, wVk must be 0.*/ public ushort wVk; /*A hardware scan code for the key. If dwFlags specifies KEYEVENTF_UNICODE, wScan specifies a Unicode character which is to be sent to the foreground application.*/ public ushort wScan; /*Specifies various aspects of a keystroke. See the KEYEVENTF_ constants for more information.*/ public uint dwFlags; /*The time stamp for the event, in milliseconds. If this parameter is zero, the system will provide its own time stamp.*/ public uint time; /*An additional value associated with the keystroke. Use the GetMessageExtraInfo function to obtain this information.*/ public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] struct HARDWAREINPUT { public uint uMsg; public ushort wParamL; public ushort wParamH; } [DllImport("user32.dll")] static extern IntPtr GetMessageExtraInfo(); [DllImport("user32.dll", SetLastError = true)] static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); 

然后,在您的客户端代码中,使用:

 INPUT[] inputs = new INPUT[] { new INPUT { type = INPUT_KEYBOARD, u = new InputUnion { ki = new KEYBDINPUT { wVk = key, wScan = 0, dwFlags = 0, dwExtraInfo = GetMessageExtraInfo(), } } } }; SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT)));