无法让 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()));
        } 
    }
}

如果有人能帮忙,我会很高兴!

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

可以在此处找到必要的 C# 和 VB.NET 结构

你的SendInputEventType实际上只是一个枚举或一个带有常量的类。PInvoke也有这个定义。

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

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

这是一个很好的答案,其中包含一个在定义这些结构的情况下实现SendInput的示例:如何在 winform 和 wpf 中以编程方式移动鼠标、单击、右键单击和按键等?

你不需要这样的东西吗:

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