无法使SendInput()工作

时间:2015-02-03 22:07:17

标签: c# visual-studio-2013 mouse pinvoke sendinput

我有点绝望。我现在已经尝试了几个小时,但我无法让SendInput()工作。说实话,我甚至无法让它得到认可。它总是说:

Error   1   The type or namespace name 'INPUT' could not be found (are you missing a using directive or an assembly reference?)

我无法找出要使用的库。关于要包含哪些内容的信息几乎为零,我只能找到C ++,或者当我尝试using时它根本就不存在。请帮助!

我试图让我的程序做一个鼠标点击...这是代码,它是我发现并试图开始工作的众多版本之一。 在此版本中,该程序也无法找到INPUTSendInputEventType

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

namespace autoPlayer
{
    class Win32
    {
        enum SystemMetric
        {
          SM_CXSCREEN = 0,
          SM_CYSCREEN = 1,
        }

        [DllImport("user32.dll")]
        static extern int GetSystemMetrics(SystemMetric smIndex);

        int CalculateAbsoluteCoordinateX(int x)
        {
          return (x * 65536) / GetSystemMetrics(SystemMetric.SM_CXSCREEN);
        }

        int CalculateAbsoluteCoordinateY(int y)
        {
          return (y * 65536) / GetSystemMetrics(SystemMetric.SM_CYSCREEN);
        }

        public static void ClickLeftMouseButton(int x, int y)
        {
            INPUT mouseInput = new INPUT();
            mouseInput.type = SendInputEventType.InputMouse;
            mouseInput.mkhi.mi.dx = CalculateAbsoluteCoordinateX(x);
            mouseInput.mkhi.mi.dy = CalculateAbsoluteCoordinateY(y);
            mouseInput.mkhi.mi.mouseData = 0;


            mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_MOVE | MouseEventFlags.MOUSEEVENTF_ABSOLUTE;
            SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));

            mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN;
            SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));

            mouseInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTUP;
            SendInput(1, ref mouseInput, Marshal.SizeOf(new INPUT()));
        } 
    }
}

如果有人能提供帮助,我会很高兴的!

2 个答案:

答案 0 :(得分:0)

你不需要这样的东西:

[DllImport("user32.dll")]
   internal static extern uint SendInput (uint nInputs,
      [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs,
      int cbSize);

答案 1 :(得分:0)

您缺少INPUT结构。它不是来自System.Windows.Input,如果这是你的想法(由using猜测)。

您可以找到必要的C#和VB.NET结构here

你的SendInputEventType实际上只是一个枚举或具有常量的类。 PInvoke has that defined as well

internal enum INPUT_TYPE : uint 
{
      INPUT_MOUSE = 0,
      INPUT_KEYBOARD = 1,
      INPUT_HARDWARE = 2
}

您可以更新代码以使用此名称,或重命名此枚举以匹配您的代码。这取决于你。

这是一个很好的答案,其中有一个实例SendInput定义了这些结构的示例:how to programatically mouse move,click,right click and keypress, etc. in winform and wpf?