I'm kind of desperate. I have been trying for hours now, but I just can't get SendInput()
to work. 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. 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.
In this version, the program also can't find INPUT
and SendInputEventType
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!
You are missing the INPUT
structure. It doesn't come from System.Windows.Input
if that's what you thought (guessing due to using
).
You can find the necessary C# and VB.NET structures here
Your SendInputEventType
is really just going to be an enum or a class with constants. PInvoke has that defined as well.
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?