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

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

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

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

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

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

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

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

1哈哈,效果,这个我们首先需要引用调用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);
}

我们继续吧,下面我们做的是设置鼠标的位置,用按钮来控制鼠标显示的位置。

1

毫无疑问,我们还是找到如何定位鼠标的函数

[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,谢谢大家


作者:KingDZ
出处:http://www.cnblogs.com/hihell/
关于作者:作者喜欢编程,擅长ASP.NET网站开发,喜欢MVC,SilverLight开发,喜欢交流,喜欢创新
我的QQ:860866679 MSN:wangdezhen@live.com 期待有共同志向者交流进步。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题 可以通过KingDZ's Email  联系我,非常感谢。

posted on 2011-09-15 15:23  freedom831215  阅读(209)  评论(0编辑  收藏  举报