How to perform doubleclick?

-1

I know, there are a lot of questions like this. But every answer i read, did not helped me.. So i ask here.

I want to perform a mouse double click. Before that i have already set the cursor to the correct position:

  Cursor.Position = new System.Drawing.Point(2225, 154);

I already used almost every class i found here, and no one helped me. (The cursor was set, but no double click were performed..)

Hope anyone can help me. Thanks!

Greets

edit: the class i used:

using System;
using System.Runtime.InteropServices;

namespace AutoClicker
{

    public class MouseSimulator
    {

      public void test_Click(System.Drawing.Point p)
           {
            //Move the mouse to the button position

            //Perform button click.
            INPUT structInput = new INPUT();
            structInput.type = SendInputEventType.InputMouse;
            structInput.mkhi.mi.dwFlags = MouseEventFlags.ABSOLUTE | MouseEventFlags.LEFTDOWN | MouseEventFlags.LEFTUP;
            structInput.mkhi.mi.dx = p.X;
            structInput.mkhi.mi.dy = p.Y;
            uint i = SendInput(1, ref structInput, Marshal.SizeOf(new INPUT()));
        }

        [DllImport("user32.dll")]
        static extern IntPtr GetMessageExtraInfo();

        [DllImport("user32.dll", SetLastError = true)]
        static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

        [DllImport("user32.dll")]
        static extern bool SetCursorPos(int X, int Y);

        [Flags]
        public enum MouseEventFlags
        {
            LEFTDOWN = 0x00000002,
            LEFTUP = 0x00000004,
            MIDDLEDOWN = 0x00000020,
            MIDDLEUP = 0x00000040,
            MOVE = 0x00000001,
            ABSOLUTE = 0x00008000,
            RIGHTDOWN = 0x00000008,
            RIGHTUP = 0x00000010
        }

        /// <summary>
        /// The event type contained in the union field
        /// </summary>
        enum SendInputEventType : int
        {
            /// <summary>
            /// Contains Mouse event data
            /// </summary>
            InputMouse,
            /// <summary>
            /// Contains Keyboard event data
            /// </summary>
            InputKeyboard,
            /// <summary>
            /// Contains Hardware event data
            /// </summary>
            InputHardware
        }


        /// <summary>
        /// The mouse data structure
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        struct MouseInputData
        {
            /// <summary>
            /// The x value, if ABSOLUTE is passed in the flag then this is an actual X and Y value
            /// otherwise it is a delta from the last position
            /// </summary>
            public int dx;
            /// <summary>
            /// The y value, if ABSOLUTE is passed in the flag then this is an actual X and Y value
            /// otherwise it is a delta from the last position
            /// </summary>
            public int dy;
            /// <summary>
            /// Wheel event data, X buttons
            /// </summary>
            public uint mouseData;
            /// <summary>
            /// ORable field with the various flags about buttons and nature of event
            /// </summary>
            public MouseEventFlags dwFlags;
            /// <summary>
            /// The timestamp for the event, if zero then the system will provide
            /// </summary>
            public uint time;
            /// <summary>
            /// Additional data obtained by calling app via GetMessageExtraInfo
            /// </summary>
            public IntPtr dwExtraInfo;
        }

        [StructLayout(LayoutKind.Sequential)]
        struct KEYBDINPUT
        {
            public ushort wVk;
            public ushort wScan;
            public uint dwFlags;
            public uint time;
            public IntPtr dwExtraInfo;
        }

        [StructLayout(LayoutKind.Sequential)]
        struct HARDWAREINPUT
        {
            public int uMsg;
            public short wParamL;
            public short wParamH;
        }

        /// <summary>
        /// Captures the union of the three three structures.
        /// </summary>
        [StructLayout(LayoutKind.Explicit)]
        struct MouseKeybdhardwareInputUnion
        {
            /// <summary>
            /// The Mouse Input Data
            /// </summary>
            [FieldOffset(0)]
            public MouseInputData mi;

            /// <summary>
            /// The Keyboard input data
            /// </summary>
            [FieldOffset(0)]
            public KEYBDINPUT ki;

            /// <summary>
            /// The hardware input data
            /// </summary>
            [FieldOffset(0)]
            public HARDWAREINPUT hi;
        }

        /// <summary>
        /// The Data passed to SendInput in an array.
        /// </summary>
        /// <remarks>Contains a union field type specifies what it contains </remarks>
        [StructLayout(LayoutKind.Sequential)]
        struct INPUT
        {
            /// <summary>
            /// The actual data type contained in the union Field
            /// </summary>
            public SendInputEventType type;
            public MouseKeybdhardwareInputUnion mkhi;
        }
    }

}

and i used it like this:

System.Drawing.Point p = new System.Drawing.Point(2225, 154);
        Cursor.Position = p;
        MouseSimulator ms = new MouseSimulator();
        ms.test_Click(p);
c#
winapi
mouse
asked on Stack Overflow Jun 8, 2017 by Joe Manston • edited Jun 8, 2017 by Sir Rufo

1 Answer

1

If you need ti simulate the double click, you need to send 4 INPUT using SendInput():

public void test_Click(System.Drawing.Point p) {
    //Move the mouse to the button position

    //Perform button click.
    INPUT down = new INPUT();
    down.type = SendInputEventType.InputMouse;
    down.mkhi.mi.dx = p.X;
    down.mkhi.mi.dy = p.Y;
    down.mkhi.mi.dwFlags = MouseEventFlags.LEFTDOWN;

    INPUT up = new INPUT();
    up.type = SendInputEventType.InputMouse;
    up.mkhi.mi.dx = p.X;
    up.mkhi.mi.dy = p.Y;
    up.mkhi.mi.dwFlags = MouseEventFlags.LEFTUP;

    INPUT[] dbl = {down, up, down, up};

    SendInput(4, dbl, Marshal.SizeOf(down));
}

Also, define SendInput() as follows:

static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
answered on Stack Overflow Jun 8, 2017 by Tide Gu • edited Jun 8, 2017 by Tide Gu

User contributions licensed under CC BY-SA 3.0