Vasu
Vasu

Reputation: 1110

How to simulate a mouseclick in C#? (I keep getting an error)

Alright guys, well, here is the thing. I used this wonderful website and found a code snippet that helped me create a basic clicking script. The problem is that I keep getting an error when debugging - pointing right at my mouseclick line. Below, I've added the error in code tags.

PInvokeStackImbalance was detected
Message: A call to PInvoke function 'MagicMouse!MagicMouse.Form1::mouse_event' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

I've given it my best effort, and gone through a couple google searches .. but I can't find anything, maybe I'm just doing it wrong. Either way, I'd love if you guys could help me. Below is my actual code.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.InteropServices;

namespace MagicMouse
{
    public partial class Form1 : Form
    {
        //all this stuff has to do with being able to actually click a mouse
        [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
        public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
        private const int MOUSEEVENTF_LEFTDOWN = 0x02;
        private const int MOUSEEVENTF_LEFTUP = 0x04;
        private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
        private const int MOUSEEVENTF_RIGHTUP = 0x10;

        //this function will click the mouse using the parameters assigned to it
        public void DoMouseClickLeft()
        {
            //Call the imported function with the cursor's current position
            int X = Cursor.Position.X;
            int Y = Cursor.Position.Y;
            mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
        }

        public void NumberCheck(string ValidateNum)
        {
            long CanConvertOut = 0;
            bool CanConvertBool = long.TryParse(ValidateNum, out CanConvertOut);
            if (CanConvertBool == false)
            {
                MessageBox.Show("Please enter a valid number");
                return;
            }
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        //button 1 is start alching
        private void button1_Click(object sender, EventArgs e)
        {
            //this section sends data to the number validation function
            string ValidateNum = NumberOfItems.Text;
            NumberCheck(ValidateNum);
            int Alchs = Convert.ToInt16(NumberOfItems.Text);

            for (int i = 1; i < Alchs; i++)
            {
                DoMouseClickLeft();
            }
        }

        //button 2 is exit
        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();

        }


    }
}

Upvotes: 4

Views: 2725

Answers (1)

Yahia
Yahia

Reputation: 70369

It is exactly what the error messages says - change the DllImport declaration to:

[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData,
   UIntPtr dwExtraInfo);

For more information, see http://pinvoke.net/default.aspx/user32.mouse_event

But since mouse_event is deprecated, consider using SendInput instead.

See:

Upvotes: 6

Related Questions