今天给大家带来的实例是一个大家一个相对接触比较少的东东,C#控制鼠标。哈哈,这个我想有些童鞋可以自己研究一下,大家可以简单的模仿一个按键精灵出来。
如果更变态的,那么哥们你强大了,这玩意可以开发“科技类软件”,----哇咔咔,WG了,呵呵,不过偶是“好yin”怎么会研究那个呢?
呵呵,好了不和大家胡诌了,下面开始吧。
控制鼠标可以限制鼠标的移动范围,控制鼠标的位置,控制鼠标的左右键,显示和隐藏鼠标。
控制鼠标用到了我们的系统的API---“什么你不知道系统的API是什么?”问问谷歌大神去吧。
首先我们先得到鼠标的位置,只有抓到这个老鼠,好进行下一步的操作啊。
首先声明一点就是.Net并没有提供改变鼠标指针位置、模拟点击操作的函数。
所以我们只能去找 Windows API 了。
using System.Runtime.InteropServices;
然后我们即可调用
[DllImport("User32")]
然后 我们用准备工作做好了,我们可以开始我们下面的道路了,我们首先需要一个timer 用来无时无刻得到我们的鼠标位置,然后我们需要的当然是一个坐标来展示我们的数据了啊
Timer timer; Point p = new Point(1,1);
好了,我们有了上面两个全局的变量,可以开始我们的整体效果楼,哈哈哈。
[DllImport("User32")] public extern static bool GetCursorPos(ref Point cPoint);
记住一定要用到 ref 否则会出问题的。接下来的就好办多了
private void Form1_Load(object sender, EventArgs e) { timer = new Timer(); timer.Interval = 1; timer.Tick += new EventHandler(timer_Tick); timer.Enabled=true; } void timer_Tick(object sender, EventArgs e) { GetCursorPos(ref p); lblX.Text = p.X.ToString(); lblY.Text = p.Y.ToString(); }
OK,完成了,大家是一下吧,,上面的那个GetCursorPos其实就是我们需要获取鼠标坐标的函数。
好了,下面我们来实现限定鼠标移动的范围。
限制移动鼠标需要ClipCursor和GetWindowRect来实现
首先我们先想办法限制鼠标的移动,将鼠标限制在摸一个窗体里面
[DllImport("User32")] public extern static int ClipCursor(ref Rect r); [DllImport("User32")] public extern static int GetWindowRect(int h, ref Rect r);
好了,这两个函数都得到了。下面我们继续 上面那个 Rect
是一个结构类型,我将 Rect声明成
public struct Rect { public int Left; public int Top; public int Right; public int Bottom; }
然后为的就是方便操作,你也可以根据自己的办法想象开来。当然后面也是为了都得到窗体句柄做准备。
public void Lock(Form objectForm) { Rect formRect = new Rect(); GetWindowRect(objectForm.Handle.ToInt32(), ref formRect); ClipCursor(ref formRect); }
objectForm.Handle.ToInt32(),得到句柄。关于句柄的具体用途,我在这里就不深入的解说了,可能我们以后的实例中会碰到,我们到时见在慢慢的解说。
Lock(this);
好了,完成,当然恢复鼠标的移动范围想简单的多了,只需要回复坐标即可。
private void btnUnlock_Click(object sender, EventArgs e) { Rect ur = new Rect(); ur.Left = 0; ur.Top = 0; ur.Bottom = Screen.PrimaryScreen.WorkingArea.Bottom; ur.Right = Screen.PrimaryScreen.WorkingArea.Right; ClipCursor(ref ur); }
我们继续吧,下面我们做的是设置鼠标的位置,用按钮来控制鼠标显示的位置。
毫无疑问,我们还是找到如何定位鼠标的函数
[DllImport("User32")] public extern static void SetCursorPos(int x,int y); 剩下的就简单多了
private void btnMove_Click(object sender, EventArgs e) { SetCursorPos(Convert.ToInt32(txtX.Text), Convert.ToInt32(txtY.Text)); }
下面我来操作鼠标的左键和右键,显示与隐藏鼠标和设置双击鼠标的时间间隔等
通常使用API函数SwapMouseButton、ShowCursor、SetDoubleClickTime和GetDoubleClickTime对鼠标进行设置。
我们下面就是先鼠标单击选中事件,哈哈,看讲解。我们需要一个关于鼠标的所有枚举。
[Flags] enum MouseEventFlag : uint { Move = 0x0001, LeftDown = 0x0002, LeftUp = 0x0004, RightDown = 0x0008, RightUp = 0x0010, MiddleDown = 0x0020, MiddleUp = 0x040, XDown = 0x0080, XUp = 0x0100, Wheel = 0x0800, VirtualDesk = 0x4000, Absolute = 0x8000 }
这个每个枚举值是什么意思,大家自己看一下即可。
const int Move = 0x0001; 移动鼠标
const int LeftDown = 0x0002; 模拟鼠标左键按下
const int LeftUp = 0x0004; 模拟鼠标左键抬起
const int RightDown = 0x0008; 模拟鼠标右键按下
const int RightUp = 0x0010; 模拟鼠标右键抬起
const int MiddleDown = 0x0020; 模拟鼠标中键按下
const int MiddleUp = 0x0040; 模拟鼠标中键抬起
const int Absolute = 0x8000; 标示是否采用绝对坐标
[DllImport("user32.dll")] public static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo); private void btnO_Click(object sender, EventArgs e) { SetCursorPos(Convert.ToInt32(txtX.Text), Convert.ToInt32(txtY.Text)); mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero); mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, UIntPtr.Zero); }
好了,大家简单的理解一下吧,这里本想给大家解释一下的,后来其实看了也没什么,大家可以去MSDN查找相关资料
http://msdn.microsoft.com/en-us/library/ms646260%28v=VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms646260(v=VS.85).aspx
这两个链接有他们的说明当然,为了简单起见上面的代码你可以写成
mouse_event(MouseEventFlag.LeftDown, 0, 0, 0, 0);
其他的代码俺就不解释了
两次连续的鼠标左键单击事件 构成一次鼠标双击事件:
mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero); mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
好了下面我们再说几个,鼠标的操作,俺就说完了。
[DllImport("User32")] public static extern int ShowCursor(bool bshow); private void btnHide_Click(object sender, EventArgs e) { ShowCursor(false); } private void btnShow_Click(object sender, EventArgs e) { ShowCursor(true); }哈哈,其他的就不试了,大家自己尝试一下吧。如果发现问题,欢迎致电 KingDZ,谢谢大家
代码下载链接