ziyiFly

鼠标重要性不必多说, 我们这些"小毛孩"可能不敢想象没有鼠标时的计算机是如何操作的, 我承认鼠标不是不可替代, 但也已不可或缺.

大多鼠标编程都与 API 函数有着某种关系, 毕竟鼠标的操作已进入了非纯软件领域. 因此, 要对鼠标下刀, 就得熟悉相关的 API 函数, 这点无可厚非.

今天我们就对鼠标编程进行一个大杂汇. 工作中能否用到, 不太清楚..... 

下面就分四个部分讲述我们与鼠标的不解之缘.

 

一. 应用篇:

1. 利用鼠标绘图

很多很多书籍, 很多很多网页都在讲述这个东东, 为了不找骂, 这里直接附代码! 

实现: 利用窗体的 MouseDown, MouseMove, MouseUp事件及Pen, Graphics等类实现.

代码: 

鼠标绘图

效果:

 

 

2. 限制鼠标只在某一区域内工作

去过网吧的小朋友都知道, 开机后一段时间内鼠标只能在一个很小的区域内移动, 并且提示 "系统正在初始化, 鼠标已锁"之类似东东. 

原理: 利用 API 函数 ClipCursor和 GetWindowRect 联手实现. 前者指定区域大小, 后者获得整个窗口的范围矩形, 窗口的边框等信息.

代码:

限制鼠标活动区域

 

3. 利用鼠标拖放复制(剪切)文本

现在基本上所有的文本编辑器都有这个功能: 选中一行字, 然后按下鼠标拖动到另一个位置然后放手即可. 这里演示将一个简单的: 将一个文本框中的内容直接拖动到另一个文本框中(复制粘贴--平时用的文本编辑器是剪切粘贴原理). 

原理: 将第二文本框 ( 目标文本框 ) 的 AllowDrop 属性设为 True. 它指示控件是否可以接受拖放到它上面的数据. 然后再定义一些 MouseMove, DragDrop, DragEnter等事件.

代码:  

利用鼠标拖放复制文本

 

二. 小 CASE 篇

1. 鼠标双击窗体时模拟键盘 Tab 键实现光标移位

原理: 在窗体的 DoubleClick事件中使用 SendKeys 类的 Send 方法实现.

代码: 

鼠标模拟键盘Tab键功能

 

2. 定义鼠标形状

原理: 每一个 Winform 控件都有一个 Cursor 属性, 其作用就是改变鼠标形状的. 

比如, 常用的是在读大量数据时可以将鼠标形状定义为"忙", 即专业术语--等待状态, 而  当数据读完后恢复默认...) 

代码: 

定义鼠标形状

 

3.自定义鼠标图片

原理: 将整个窗体( 注, 不是控件)的 Cursor 属性重新定义.

代码: 

自定义鼠标图片

  

4.获得鼠标在窗体上的位置 (汗~~~)

没有原理, 这是常识.

代码: 

获得鼠标在窗体上的位置

 

5.获取鼠标双击时间间隔

 原理: 利用 API 函数 GetDoubleClickTime

 代码:

获取鼠标双击时间间隔

 

6. 隐藏和显示鼠标

原理: API:  ShowCursor

代码:

隐藏和显示鼠标
       ("user32.dll", EntryPoint = "ShowCursor")]
public extern static bool ShowCursor(bool bShow);
//鼠标隐藏
public void Hide()
{
ShowCursor(
false);
}
//鼠标显示
public void Show()
{
ShowCursor(
true);
}
private void btnHide_Click(object sender, EventArgs e)
{
this.Hide();
}

private void btnShow_Click(object sender, EventArgs e)
{
this.Show();
}

private void Form1_Load(object sender, EventArgs e)
{

}
}
}

 

三. 无聊篇

1. 获取鼠标键数 

原理: API: GetSystemMetricsg 

代码: 

电脑鼠标键数

 

2. 交换鼠标左右键的功能

原理: API : SwapMouseButton

代码:

交换鼠标左右键功能

 

3. 记录鼠标行为

原理: 可在MouseDown 事件中判断您到底单击了鼠标的左右中3个键中的哪一个.

代码:

记录鼠标行为

 

四. 超越篇

1. 禁止使用鼠标左(右)键

直接附代码:

禁用鼠标左键

 

 

2. 模拟鼠标操作

直接附代码:

模拟鼠标操作
       (int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
const int MOUSEEVENTF_MOVE = 0x0001;
const int MOUSEEVENTF_LEFTDOWN = 0x0002;
const int MOUSEEVENTF_LEFTUP = 0x0004;
const int MOUSEEVENTF_RIGHTDOWN = 0x0008;
const int MOUSEEVENTF_RIGHTUP = 0x0010;
const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;
const int MOUSEEVENTF_MIDDLEUP = 0x0040;
const int MOUSEEVENTF_ABSOLUTE = 0x8000;
private void button1_Click(object sender, EventArgs e)
{
mouse_event(MOUSEEVENTF_MOVE,
-20, -20, 0, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN,
-20, -20, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP,
0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN,
0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP,
0, 0, 0, 0);
}

private void Form1_Load(object sender, EventArgs e)
{

}
}
}

  

3. 鼠标穿透窗体

直接附代码:

鼠标穿透窗体

 

 

后记: 这些案例有的是自己平时工作中写的, 有的是园子里不小心看到的, 有的是直接Google的. 汇总与此为大家引用方便.

 

 

 

 

 

分类:

技术点:

相关文章: