KingDZ 变菜鸟,每日一个C#小实例之---玩转鼠标
今天给大家带来的实例是一个大家一个相对接触比较少的东东,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#小实例之---玩转鼠标相关推荐
- KingDZ 变菜鸟,每日一个C#小实例之---C#自动填表
这个小实例的作用是用来自动填表,当然是WinForm填写网站上面的表单了,我在这里只是提供一种思想,哈哈,大伙不要用这个来开发非法的软件哦.例如,自动注册,批量评论什么的啊. 但是对于某些看着不爽得网 ...
- KingDZ 变菜鸟,每日一个C#小实例之---百叶窗图片展示
这回给大家做的一个效果图如下: 看到了吗?哈哈,我们C# 也可以做出来很好的效果哦,我们下面开始吧. 首先大家要熟悉 Bitmap 的用法,因为我们这次就是用到了这种位图..还有可能需要大家了解一些 ...
- 安卓期末作品小项目_每日一个财务小知识——洞悉洞晰财务报告第一季
财务报告 洞悉洞晰财务报告 目录 01/账务报告概述 02/资产负债表 03/利润表 04/现金流量表 05/所有者权益变动表 06/附注 一.财务报告概述 (一)财务报告及其目标 财务报告是指企业对 ...
- 【Python基础】Github标星4.7k,每天推送一个python小实例的Python库
文章来源于Python与算法社区,作者zhenguo 推荐一个 python-small-examples 库,每天推送一个Python实例.时至今日,共有4700人 star 期间多次登上githu ...
- android 打开免打扰模式_「每日一个手机小技巧」手机飞行模式原来有着这么重要的作用...
提到"飞行模式"这个模式,在安卓手机和iPhone普及之前就它就已经存在于我们的手机之中,那么它究竟是一个怎样的模式呢?平时我们又是否有需要开启这个模式,或者说什么时候需要开启什么 ...
- 程序员每日一个开除小技巧~~
俗话说的好,代码写的少,离职少不了.最近畅游互联网,发现一些离职小技巧,读后,内心被深深的打动了. 但是细细的品过之后,发现对我们程序员不太适用,例如: 领导夹菜你转桌,我们程序员一般不和领导在一桌: ...
- 每日一个css小技巧 6/10 水平垂直居中
行内元素水平垂直居中 1 常规设置 一句话总结: text-align设置水平居中,line-height = height 设置垂直居中 2 父盒子模拟为表格 块级元素水平垂直居中 1 positi ...
- 每日一个 ChatGPT 使用小技巧系列之2 - 用 ChatGPT 研读 SAP ABAP BAPI 的实现源代码
本系列之前的文章: 与其整天担心 AI 会取代程序员,不如先让 AI 帮助自己变得更强大 每日一个 ChatGPT 使用小技巧系列之1 - 给出提纲或者素材,让 ChatGPT 帮你写作 正好昨天有朋 ...
- Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作
Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序 2 ...
- html class和id,css教程之样式表的基本语法(二) class(类)和id的一个小实例
class(类)和id的一个小实例 在上一节中我们了解了如何为特定的标签定义样式,例如我们利用 "h1{font-size: 12px;}"将页面内所有的标题1的字体大小改为了12 ...
最新文章
- Leetcode70场双周赛-第一题2144. 打折购买糖果的最小开销
- php中isdefin,在PHP中定義全局常量數組的最“優雅”方法是什么
- 用promise封装ajax_vue实践---vue结合 promise 封装原生ajax
- axios+vue实现动态渲染员工数据+数据是对象
- ​2020启示:拼多多篇— —退潮后,你才发现人家是游泳健将
- 红米骁龙855旗舰关键细节曝光:256G ROM+GPU超频模式
- spdlog linux编译出错,Linux下编写Makefile引入第三方库
- c语言sort可以给字符排序吗,字符串排序 (C++代码)sort的第三个参数
- ubuntu设置打开主目录(home文件夹)的快捷键
- Nginx 1.5.2 + PHP 5.5.1 + MySQL 5.6.10 在 CentOS 下的编译安装
- 微信支付需要证书认证时报“出现了内部错误”
- vscode 修改(自定义)插件的快捷键
- 计算机管理里面和打印机相关的,打印机设备
- 数字IC设计verilog编写——6脉冲同步器
- 在代码里面如何使用workman
- 用Excel制作条形码
- 这种性生活伤女人尿道
- 华为云sql工程师评测答题[青铜+白银]
- 苹果手机话筒声音小怎么办_苹果8通话声音小,苹果8听筒声音小怎么办
- The Sultan's Successors (八皇后)DFS