4
我已經手動使用此代碼來模擬系統通過代碼點擊鼠標。我應該怎麼做使這個代碼在VS 2010中工作?
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
public class Form1 : Form
{
[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;
public Form1()
{
}
public void DoMouseClick()
{
//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);
}
//...other code needed for the application
}
但現在我使用VS 2010和Windows 7和我得到的錯誤在此代碼的執行,現在
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
因此,對於這個有什麼建議?
錯誤我遇到的是:
PInvokeStackImbalance檢測
對PInvoke函數'ClickingApp!ClickingApp.Form1 :: mouse_event'的調用使堆棧不平衡。這很可能是因爲託管的PInvoke簽名與非託管目標籤名不匹配。檢查PInvoke簽名的調用約定和參數是否與目標非託管簽名相匹配。
請問你解釋調用約定的事情,因爲我不知道它... $ – Mobin 2010-07-08 18:12:07
@Mobin,調用約定定義參數如何傳遞給函數,以及誰負責在函數完成時清理堆棧。例如C中的一個典型調用約定,參數以相反的順序壓入堆棧,調用者負責堆棧清理,而stdcall調用約定是它自己負責清理堆棧的函數。函數使用特定的調用約定進行編譯,如果調用者使用錯誤的約定,堆棧將處於不一致的狀態。 – 2010-07-08 18:18:32
哦謝謝先生!我知道了 :) – Mobin 2010-07-09 19:37:04