SendInput()PInvoke不起作用,我不知道为什么

时间:2013-11-14 18:10:22

标签: c# pinvoke sendinput

由于某种原因,SendInput()Pinvoke不起作用。 SendInput()总是返回0,我试图以管理员身份运行它,仍然没有变化。它在c ++中完美运行。 我一直在找几个小时,请帮帮我。 我正在运行Windows 8 64x位计算机。也许它与我的操作系统有关?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication6
{
    class Program
    {
        [DllImport("User32.dll", SetLastError = true)]
        public static extern int SendInput(int nInputs, INPUT[] inputs, int cbSize);

        public struct INPUT
        {
            public int type;
            public KEYBDINPUT ki;

        }

        private static KEYBDINPUT createKeybdInput(ushort wVK, uint flag)
        {
            KEYBDINPUT i = new KEYBDINPUT();

            i.wVk = wVK;
            i.wScan = 0;
            i.time = 0;
            i.dwExtraInfo = IntPtr.Zero;
            i.dwFlags = flag;
            return i;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct KEYBDINPUT
        {
            public ushort wVk;
            public ushort wScan;
            public uint dwFlags;
            public uint time;
            public IntPtr dwExtraInfo;
        }



        public static void sim_type()
        {

            INPUT[] inp = new INPUT[2];


            inp[0].type = 1;
            inp[0].ki = createKeybdInput(0x41, 0x0001);
            inp[1].type = 1;
            inp[1].ki = createKeybdInput(0x41, 0x0002);



            if (SendInput(2, inp, Marshal.SizeOf(typeof(INPUT))) == 0)
            {
                Console.WriteLine("error");
            }



        }

        static void Main(string[] args)
        {
            Console.ReadLine();
            sim_type();
            Console.ReadLine();

        }


    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

问题是您INPUT的翻译不正确。看看definition from MSDN

typedef struct tagINPUT {
  DWORD type;
  union {
    MOUSEINPUT    mi;
    KEYBDINPUT    ki;
    HARDWAREINPUT hi;
  };
} INPUT, *PINPUT;

您对KEYBDINPUT的定义很好,但MOUSEINPUTHARDWAREINPUT呢?你刚刚忽略了它们。这是一个联盟,所以三个成员都是彼此叠加的。因此,只有当KEYBDINPUT是三者中最大的一个时,您的声明才有效。聪明的钱说它不是。

因此,请声明MOUSEINPUTHARDWAREINPUT并将其包含在INPUT的翻译中。您可以从pinvoke.net获得现成的翻译。并确保您注意到API调用返回的错误消息。您已将SetLastError指定为true。所以读出价值并注意它。