I was trying to simulate (global) mouse click using SendInput() from user32 dll in C# .NET. I have already tried SendInput() for keyboard input and it works fine. But for some reasons it doesn't work for mouse input.
here is my code,
For simplicity, I have not put the definition for KEYBDINPUT and HARDWAREINPUT (struct). as MOUSEINPUT is only relevant here.
[DllImport("user32.dll")]
internal static extern uint SendInput(uint nInputs, [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs, int cbSize);
//main calling method
public static void CLICK()
{
INPUT []i = new INPUT[1];
i[0].type = 0;
i[0].U.mi.time = 0;
i[0].U.mi.dwFlags = MOUSEEVENTF.LEFTDOWN | MOUSEEVENTF.ABSOLUTE;
i[0].U.mi.dwExtraInfo = UIntPtr.Zero;
i[0].U.mi.dx = 1;
i[0].U.mi.dy = 1;
SendInput(1, i, INPUT.Size);
}
[StructLayout(LayoutKind.Sequential)]
public struct INPUT
{
internal uint type;
internal InputUnion U;
internal static int Size
{
get { return Marshal.SizeOf(typeof(INPUT)); }
}
}
[StructLayout(LayoutKind.Explicit)]
internal struct InputUnion
{
[FieldOffset(0)]
internal MOUSEINPUT mi;
[FieldOffset(0)]
internal KEYBDINPUT ki;
[FieldOffset(0)]
internal HARDWAREINPUT hi;
}
[StructLayout(LayoutKind.Sequential)]
internal struct MOUSEINPUT
{
internal long dx;
internal long dy;
internal int mouseData;
internal MOUSEEVENTF dwFlags;
internal uint time;
internal UIntPtr dwExtraInfo;
}
[Flags]
internal enum MOUSEEVENTF : uint
{
ABSOLUTE = 0x8000,
HWHEEL = 0x01000,
MOVE = 0x0001,
MOVE_NOCOALESCE = 0x2000,
LEFTDOWN = 0x0002,
LEFTUP = 0x0004,
RIGHTDOWN = 0x0008,
RIGHTUP = 0x0010,
MIDDLEDOWN = 0x0020,
MIDDLEUP = 0x0040,
VIRTUALDESK = 0x4000,
WHEEL = 0x0800,
XDOWN = 0x0080,
XUP = 0x0100
}
Also, I have tried different points for x,y. and other dwFlags as well, (such as LEFTUP, MOVE..) but nothing worked so far.