2011-10-01 92 views
0

我正在嘗試通過c#執行鼠標單擊。我使用mouse_event函數來完成它。C#單擊屏幕上的某個點

private const int MOUSEEVENTF_LEFTDOWN = 0x02; 
private const int MOUSEEVENTF_LEFTUP = 0x04; 
[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); 

我嘗試了兩種方法:

移動鼠標點並單擊它:

Cursor.Position = new Point(100, 100); 
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, Cursor.Position.X, Cursor.Position.Y, 0, 0); 

傳遞的X,Y所需的點擊功能:

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,100, 100, 0, 0); 

無論哪種方式,我是這個奇怪的錯誤:

託管調試助手'PInvokeStackImbalance'在'C:\ Users \或\ Documents \ Visual Studio 2010 \ Projects \ ProjectName \ ProjectName \ bin \ Debug \ ProjectName.vshost.exe'中檢測到問題。 附加信息:對PInvoke函數「ProjectName!ProjectName.MainForm :: mouse_event」的調用使堆棧不平衡。這很可能是因爲託管的PInvoke簽名與非託管目標籤名不匹配。檢查PInvoke簽名的調用約定和參數是否與目標非託管簽名相匹配。

解決方案的任何想法?

回答

1

我會建議您使用以下的P/Invoke簽名

private const uint MOUSEEVENTF_LEFTDOWN = 0x02; 
private const uint MOUSEEVENTF_LEFTUP = 0x04; 

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

注意,雖然mouse_event方便,它已被SendInput取代。您可以在以下URL中找到SendInput和Input結構的合理p/invoke聲明。 http://www.pinvoke.net/default.aspx/user32.SendInput

0

您顯然已從舊版VB6代碼中獲得此代碼。在.NET和C#中,long是64位,與VB6不同,它是32位的。

從long切換到int,它應該沒問題。

編輯:我有點快:dwExtraInfo應該是IntPtr類型。

+0

嘗試將其類型更改爲IntPtr並將long更改爲int。 (通過新的IntPtr()作爲extrainfo)。仍然沒有變化 – user779444