[DllImport("user32.dll")]
public static extern unit SendInput(unit nInput,ref IInput[] pInputs int cbSize);public interface IInput {}public struct MouseInput : IInput {}public struct KeyBoardInput : IInput {}public struct HardWareInput : IInput {}1、声明中的第二个参数这样写行不行
2、第三个参数要求提供输入INPUT结构的大小,但是VS.net 2005中sizeof关键字不允许以结构为参数,根据MSDN所说,Marshal.SizeOf返回的值是已封送处理类型后的值,测试证明用这个函数确实不行。
3、能不能在一个IInput数组中同时加入两种或以上的操作(例如一个鼠标移动、一个键盘按键按下和一个键盘弹起的操作序列),这个问题貌似还是如何取得结构大小的问题,不过更复杂点。

解决方案 »

  1.   

    Marshal.Sizoef(IInput)*pInputs.Length
      

  2.   

    能说详细点,Marshal.SizeOf的参数只能是变量
    还有,pInputs没有Length属性,这个属性应该怎么定义呢?
      

  3.   

    http://forums.microsoft.com/china/ShowPost.aspx?PostID=3597896&SiteID=15&pageid=0        [DllImport("user32.dll")]
            public static extern UInt32 SendInput(UInt32 nInputs, ref INPUT pInputs, int cbSize);        [StructLayout(LayoutKind.Explicit)]
            public struct INPUT
            {
                [FieldOffset(0)]
                public Int32 type;
                [FieldOffset(4)]
                public KEYBDINPUT ki;
                [FieldOffset(4)]
                public MOUSEINPUT mi;
                [FieldOffset(4)]
                public HARDWAREINPUT hi;
            }        [StructLayout(LayoutKind.Sequential)]
            public struct MOUSEINPUT
            {
                public Int32 dx;
                public Int32 dy;
                public Int32 mouseData;
                public Int32 dwFlags;
                public Int32 time;
                public IntPtr dwExtraInfo;
            }
            [StructLayout(LayoutKind.Sequential)]
            public struct KEYBDINPUT
            {
                public Int16 wVk;
                public Int16 wScan;
                public Int32 dwFlags;
                public Int32 time;
                public IntPtr dwExtraInfo;
            }
            [StructLayout(LayoutKind.Sequential)]
            public struct HARDWAREINPUT
            {
                public Int32 uMsg;
                public Int16 wParamL;
                public Int16 wParamH;
            }
            
            public const int INPUT_KEYBOARD = 1;
            public const int KEYEVENTF_KEYUP = 0x0002;          private void button1_Click(object sender, EventArgs e)
            {
                INPUT inDown = new INPUT();            inDown.type = INPUT_KEYBOARD;
                inDown.ki.wVk = (int)Keys.A;
                inDown.ki.dwFlags = KEYEVENTF_KEYUP;            this.Text = SendInput(1, ref  inDown, Marshal.SizeOf(inDown)).ToString();        }