Reputation: 1110
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
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