.net c# windows 模拟滑鼠事件 2010-03-27 10:11
有時,我們需在我們的程式中模拟滑鼠的移動、點選等動作。——比如,一個再現使用者操作的宏,或者一個示範操作方法的Demo程式。那麼,我們在.Net中如何實作呢?.Net并沒有提供改變滑鼠指針位置、模拟點選操作的函數;但是Windows API提供了。其中一個是:
[DllImport("user32.dll")] static extern bool SetCursorPos(int X, int Y);
該函數可以改變滑鼠指針的位置。其中X,Y是相對于螢幕左上角的絕對位置。另一個函數是:
[DllImport("user32.dll")] static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);
這個函數不僅可以設定滑鼠指針絕對的位置,而且可以以相對坐标來設定。另外,該函數還可以模拟滑鼠左右鍵點選、滑鼠滾輪操作等。其中的MouseEventFlag是一個基于uint類型的枚舉,定義如下:
[Flags] enum MouseEventFlag : uint { Move = 0x0001, LeftDown = 0x0002, LeftUp = 0x0004, RightDown = 0x0008, RightUp = 0x0010, MiddleDown = 0x0020, MiddleUp = 0x0040, XDown = 0x0080, XUp = 0x0100, Wheel = 0x0800, VirtualDesk = 0x4000, Absolute = 0x8000 }
關于這兩個函數的詳細說明,可以檢視MSDN Library或者Windows的Platform SDK文檔。下面的示範程式(完整版源代碼,VS.Net 2005/C#)示範了使用上面的函數,控制滑鼠移動到工作列并點選“開始”按鈕的方法。(該程式使用了FindWindowEx等API函數來查找工作列及開始菜單)
原代碼:http://files.cnblogs.com/smalldust/SimulateMouse.zip
原文位址:http://www.cnblogs.com/eaglet/archive/2009/07/24/1529920.html
public partial class DemoForm : Form
{
[Flags]
enum MouseEventFlag : uint
{
Move = 0x0001,
LeftDown = 0x0002,
LeftUp = 0x0004,
RightDown = 0x0008,
RightUp = 0x0010,
MiddleDown = 0x0020,
MiddleUp = 0x0040,
XDown = 0x0080,
XUp = 0x0100,
Wheel = 0x0800,
VirtualDesk = 0x4000,
Absolute = 0x8000
}
[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);
[DllImport("user32.dll")]
static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);
const int AnimationCount = 80;
private Point endPosition;
private int count;
public DemoForm()
{
InitializeComponent();
}
private void btnStart_Click(object sender, EventArgs e)
{
endPosition.X = 1293;//設定目的地 X
endPosition.Y = 884; //設定目的地 Y
if (chkAnimation.Checked)//有過程
{
this.count = AnimationCount;
movementTimer.Start();
}
else
{
//直接執行設定
SetCursorPos(endPosition.X, endPosition.Y);
mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);
mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
}
}
private void movementTimer_Tick(object sender, EventArgs e)//即使開始運作過程
{
int stepx = (endPosition.X - MousePosition.X) / count;
int stepy = (endPosition.Y - MousePosition.Y) / count;
count--;
if (count == 0)
{
movementTimer.Stop();
//SetCursorPos(endPosition.X, endPosition.Y);//強制最終坐标
mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero);
mouse_event(MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
}
tbCursor.Text = String.Format("({0}, {1})", MousePosition.X, MousePosition.Y);
mouse_event(MouseEventFlag.Move, stepx, stepy, 0, UIntPtr.Zero);
}
}
轉載于:https://www.cnblogs.com/boxianglei/archive/2011/11/06/2238192.html