您的位置:首页 > 编程语言 > C#

KingDZ 变菜鸟,每日一个C#小实例之---玩转鼠标

2014-04-05 12:42 573 查看
今天给大家带来的实例是一个大家一个相对接触比较少的东东,C#控制鼠标。哈哈,这个我想有些童鞋可以自己研究一下,大家可以简单的模仿一个按键精灵出来。

如果更变态的,那么哥们你强大了,这玩意可以开发“科技类软件”,----哇咔咔,WG了,呵呵,不过偶是“好yin”怎么会研究那个呢?

呵呵,好了不和大家胡诌了,下面开始吧。

控制鼠标可以限制鼠标的移动范围,控制鼠标的位置,控制鼠标的左右键,显示和隐藏鼠标。

控制鼠标用到了我们的系统的API---“什么你不知道系统的API是什么?”问问谷歌大神去吧。

首先我们先得到鼠标的位置,只有抓到这个老鼠,好进行下一步的操作啊。

首先声明一点就是.Net并没有提供改变鼠标指针位置、模拟点击操作的函数。

所以我们只能去找 Windows API 了。



哈哈,效果,这个我们首先需要引用调用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,谢谢大家

代码下载链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: