2010-07-08 24 views
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簽名的調用約定和參數是否與目標非託管簽名相匹配。

回答

5

問題是與P/Invoke簽名試試這個。

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

DWORD是32位,而C#長爲64位

而且只注意到您指定的調用約定,最好是,使用P時,不指定它/調用的Windows API,或您可以使用CallingConvention.Winapi,錯誤的調用約定通常是堆棧不平衡的原因。

+0

請問你解釋調用約定的事情,因爲我不知道它... $ – Mobin 2010-07-08 18:12:07

+1

@Mobin,調用約定定義參數如何傳遞給函數,以及誰負責在函數完成時清理堆棧。例如C中的一個典型調用約定,參數以相反的順序壓入堆棧,調用者負責堆棧清理,而stdcall調用約定是它自己負責清理堆棧的函數。函數使用特定的調用約定進行編譯,如果調用者使用錯誤的約定,堆棧將處於不一致的狀態。 – 2010-07-08 18:18:32

+0

哦謝謝先生!我知道了 :) – Mobin 2010-07-09 19:37:04