今天给大家带来的实例是一个大家一个相对接触比较少的东东,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,谢谢大家

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

转载于:https://www.cnblogs.com/freedom831215/archive/2011/09/15/2177648.html

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

  1. KingDZ 变菜鸟,每日一个C#小实例之---C#自动填表

    这个小实例的作用是用来自动填表,当然是WinForm填写网站上面的表单了,我在这里只是提供一种思想,哈哈,大伙不要用这个来开发非法的软件哦.例如,自动注册,批量评论什么的啊. 但是对于某些看着不爽得网 ...

  2. KingDZ 变菜鸟,每日一个C#小实例之---百叶窗图片展示

    这回给大家做的一个效果图如下: 看到了吗?哈哈,我们C# 也可以做出来很好的效果哦,我们下面开始吧. 首先大家要熟悉 Bitmap  的用法,因为我们这次就是用到了这种位图..还有可能需要大家了解一些 ...

  3. 安卓期末作品小项目_每日一个财务小知识——洞悉洞晰财务报告第一季

    财务报告 洞悉洞晰财务报告 目录 01/账务报告概述 02/资产负债表 03/利润表 04/现金流量表 05/所有者权益变动表 06/附注 一.财务报告概述 (一)财务报告及其目标 财务报告是指企业对 ...

  4. 【Python基础】Github标星4.7k,每天推送一个python小实例的Python库

    文章来源于Python与算法社区,作者zhenguo 推荐一个 python-small-examples 库,每天推送一个Python实例.时至今日,共有4700人 star 期间多次登上githu ...

  5. android 打开免打扰模式_「每日一个手机小技巧」手机飞行模式原来有着这么重要的作用...

    提到"飞行模式"这个模式,在安卓手机和iPhone普及之前就它就已经存在于我们的手机之中,那么它究竟是一个怎样的模式呢?平时我们又是否有需要开启这个模式,或者说什么时候需要开启什么 ...

  6. 程序员每日一个开除小技巧~~

    俗话说的好,代码写的少,离职少不了.最近畅游互联网,发现一些离职小技巧,读后,内心被深深的打动了. 但是细细的品过之后,发现对我们程序员不太适用,例如: 领导夹菜你转桌,我们程序员一般不和领导在一桌: ...

  7. 每日一个css小技巧 6/10 水平垂直居中

    行内元素水平垂直居中 1 常规设置 一句话总结: text-align设置水平居中,line-height = height 设置垂直居中 2 父盒子模拟为表格 块级元素水平垂直居中 1 positi ...

  8. 每日一个 ChatGPT 使用小技巧系列之2 - 用 ChatGPT 研读 SAP ABAP BAPI 的实现源代码

    本系列之前的文章: 与其整天担心 AI 会取代程序员,不如先让 AI 帮助自己变得更强大 每日一个 ChatGPT 使用小技巧系列之1 - 给出提纲或者素材,让 ChatGPT 帮你写作 正好昨天有朋 ...

  9. Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作

    Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序 2 ...

  10. html class和id,css教程之样式表的基本语法(二) class(类)和id的一个小实例

    class(类)和id的一个小实例 在上一节中我们了解了如何为特定的标签定义样式,例如我们利用 "h1{font-size: 12px;}"将页面内所有的标题1的字体大小改为了12 ...

最新文章

  1. Leetcode70场双周赛-第一题2144. 打折购买糖果的最小开销
  2. php中isdefin,在PHP中定義全局常量數組的最“優雅”方法是什么
  3. 用promise封装ajax_vue实践---vue结合 promise 封装原生ajax
  4. axios+vue实现动态渲染员工数据+数据是对象
  5. ​2020启示:拼多多篇— —退潮后,你才发现人家是游泳健将
  6. 红米骁龙855旗舰关键细节曝光:256G ROM+GPU超频模式
  7. spdlog linux编译出错,Linux下编写Makefile引入第三方库
  8. c语言sort可以给字符排序吗,字符串排序 (C++代码)sort的第三个参数
  9. ubuntu设置打开主目录(home文件夹)的快捷键
  10. Nginx 1.5.2 + PHP 5.5.1 + MySQL 5.6.10 在 CentOS 下的编译安装
  11. 微信支付需要证书认证时报“出现了内部错误”
  12. vscode 修改(自定义)插件的快捷键
  13. 计算机管理里面和打印机相关的,打印机设备
  14. 数字IC设计verilog编写——6脉冲同步器
  15. 在代码里面如何使用workman
  16. 用Excel制作条形码
  17. 这种性生活伤女人尿道
  18. 华为云sql工程师评测答题[青铜+白银]
  19. 苹果手机话筒声音小怎么办_苹果8通话声音小,苹果8听筒声音小怎么办
  20. The Sultan's Successors (八皇后)DFS

热门文章

  1. windows下openresty环境配置
  2. 关于项目中解决bug的心得
  3. 一)golang的单例模式
  4. 让程序员过年回家包压岁钱不心痛的好办法|v3.11.0上线!
  5. PCA(主成分分析)的简单理解
  6. iOS定位服务CoreLocation
  7. date命令 简单使用
  8. Redis实战(11)高级特性(3)持久化
  9. 二级域名会不会分散主域名权重
  10. 君が呼ぶ メギドの丘で 美吉特之丘的呼唤 游戏感想