简体   繁体   English

无法使SendInput()工作

[英]Can't get SendInput() to work

I'm kind of desperate. 我有点绝望。 I have been trying for hours now, but I just can't get SendInput() to work. 我已经尝试了几个小时,但是我无法使SendInput()工作。 To be honest, I can't even get it to be recognized. 老实说,我什至无法得到认可。 It always says: 它总是说:

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

And I just can't find out which libraries to use. 而且我只是找不到要使用的库。 There's almost zero information about what to include for this, all I can find is for C++ or is simply not existing when I try using it. 关于要包含的内容的信息几乎为零,我所能找到的全部是针对C ++的,或者当我尝试using它时根本不存在。 Please Help! 请帮忙!

I'm trying to make my program do a mouseclick... Here's the code, it's one of many versions I found and tried to get to work. 我正在尝试让我的程序执行mouseclick ...这是代码,它是我发现并尝试开始工作的众多版本之一。 In this version, the program also can't find INPUT and SendInputEventType 在此版本中,该程序也找不到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()));
        } 
    }
}

I would be so glad If anyone could help! 如果有人可以帮助我,我将非常高兴!

Don't you need something like this: 您不需要这样的东西吗?

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

You are missing the INPUT structure. 您缺少INPUT结构。 It doesn't come from System.Windows.Input if that's what you thought (guessing due to using ). 如果您是这样想的话,它就不是来自System.Windows.Input (由于using猜测)。

You can find the necessary C# and VB.NET structures here 您可以在此处找到必要的C#和VB.NET结构

Your SendInputEventType is really just going to be an enum or a class with constants. 您的SendInputEventType实际上只是一个枚举或一个带有常量的类。 PInvoke has that defined as well . PInvoke也有定义

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

You can update your code to use this name or rename this enum to match your code. 您可以更新代码以使用该名称,也可以重命名该枚举以匹配您的代码。 It's up to you. 由你决定。

Here is a great answer that has an example of implementing SendInput with those structures defined: how to programatically mouse move,click,right click and keypress, etc. in winform and wpf? 这是一个很好的答案,其中包含一个使用定义的结构实现SendInput的示例: 如何以编程方式在Winform和WPF中进行鼠标移动,单击,右键单击和按键等操作?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM