winform中键盘和鼠标事件的捕捉和重写(转)

在 编写winform应用程序时,有时需要无论在哪个控件获取焦点时,对某一个键盘输入或者鼠标事件都进行同样的操作。比如编写一个处理图片的应用程序时, 希望无论当前哪个控件获得焦点,当用户按上、下、左、右键时,图片控件的滚动条都会上下左右移动,当用户拨动鼠标滚轮时图片总能发大或缩小。如果对每个控 件的键盘或鼠标事件都进行设置,必然会造成很多的重复工作。本文我将介绍如何在winform下对某一个键盘输入或者鼠标事件进行相同的操作。

1、键盘事件的捕捉和重写

首先是键盘操作,为了实现上述功能,现在介绍winform的一个方法。ProcessCmdKey.其msdn说明的地址为:msdn
ProcessCmdKey介绍

从函数名就可以看出,这其实是设置winform的快捷键的函数。

在消息预处理过程中调用此方法,以处理命令键。命令键是始终比常规输入键具有优先权的键。命令键的示例包括快捷键和菜单快捷方式。此方法必须返回true,以指示它已经处理完命令键,或者false,以指示该键不是命令键。仅当控件承载在
Windows 窗体应用程序中或充当 ActiveX 控件时,才调用此方法。”

上述是msdn对该函数的介绍。其意思是,在该函数中定义的键 盘操作响应事件具有最高的优先权,会在所有的键盘响应时间之前执行。如果想在执行完该事件之后执行与该键盘输入相关的事件则返回false(即认为该输入 事件未处理),如果要屏蔽其它响应时间则返回true(即告诉应用程序这个键盘输入我已经处理过了,后面就不要再处理了)。

因此有了这个函数就可以很好的屏蔽程序中的其他键盘输入响应事件,从而自己定义对每个键盘输入的响应。

下面给一个实例:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData){switch (keyData){case Keys.Right:MessageBox.Show("Right");return true;case Keys.Left:MessageBox.Show("Left");return true;case Keys.Up:MessageBox.Show("up");return true;case Keys.Down:MessageBox.Show("down");return true;case Keys.Space:MessageBox.Show("space");return true;case Keys.Enter:MessageBox.Show("enter");return true;}return false;}

在实际程序中,只需要将上述代码加入winform应用程序的窗体类中,然后替换MessageBox为自己想要实现的功能即可。

2、对于鼠标的事件,有上述要求的主要是鼠标的滚轮滚动事件。因为鼠标的点击双击移动等事件都是与鼠标指针指向有关的,没有必要对所有的都 执行相同的操作,只有鼠标滚轮事件与当前鼠标指针的指向的关系不大,对其执行相同的操作有一定的实际意义。正如前面所说的在处理图片的应用程序中可能需要 无论在何种情况下,鼠标滚轮下拨都对应着放大图片,而上滚都对应着缩小图片。

对于这个功能要求采用的是鼠标事件委托

具体操作为在窗体初始化的时候将鼠标滚轮事件委托到一个自定义函数上,代码如下:

public Form1(){InitializeComponent();this.MouseWheel+= new MouseEventHandler(MyMouseWheel);}

其中第二句语句的意思是将这个程序的鼠标滚轮事件绑定到MyMouseWheel这个函数上,然后后续自己定义一个MyMouseWheel的函数即可

我定义的MyMouseWheel函数如下:

 private void MyMouseWheel(object sender, System.Windows.Forms.MouseEventArgs e){if (e.Delta > 0){MessageBox.Show("滚轮向前滚动");}else{MessageBox.Show("滚轮向后滚动");}}

在具体应用中将MessageBox替换为要实现的功能即可。

转载于:https://www.cnblogs.com/candyzhmm/p/5661434.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redisTemplate获得key的过期时间方法

/** * 从redis中获取key对应的过期时间; * 如果该值有过期时间,就返回相应的过期时间; * 如果该值没有设置过期时间,就返回-1; * 如果没有该值,就返回-2; */ redisTemplate.opsForValue().getOperations().getExpire("key的名称")

2020年“1024”,程序员日

1024程序员日向可爱的程序员致敬随着时代的发展,大数据技术行业发展愈趋成熟,坚持自己对知识、技术和创新追求的程序员层出不穷。相信很多人都不知道,其实,程序员也有他们自己专属的节日: 程序员日。每个节日都有自己的来历和含义…

小程序内嵌h5页面分享_微信小程序webview内页面分享

因为项目原因,之前在微信小程序内部使用 webview 嵌套了 h5 页面,现在要添加一个新的功能,用户在哪个页面进行了分享,被分享的用户从链接进来就跳转到哪个分享页面。先了解一下 web-view 组件的限制,web-view 是承载网…

shell shift与{}_一文掌握shell脚本中shift的用法及功能

概述今天主要介绍下shell脚本中shift的一些用法,这个命令还是相对比较少见的。一、shift介绍shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本)。简而言之&…

redisTemplate设置key零点过期,生成自增的单号

public String getId() {String key "finance:funs:code";Long incr getIncr(key);if (incr 0) {incr getIncr(key);//从0001开始}DecimalFormat df new DecimalFormat("0000");//四位序列号String format df.format(incr);return format;}public Lo…

docker log 文件 清理

1 查看docker log 文件位置 docker inspect *** 2 定时清理 truncate -s 0 /var/lib/docker/containers/*/*-json.log docker 日志管理 https://docs.docker.com/engine/admin/logging/json-file/ 全局配置 默认位置 /etc/docker/daemon.json 由dockerd 启动参数 --config-fi…

计算机网络基础:常见的网络传输介质

传输介质是信号传递的媒体,常用的网络传输介质包括有线介质(双绞线、同轴电缆、光纤等)和无线介质(微波、红外线、激光等)。 1、双绞线 双绞线是目前最普遍的传输介质,分为两类:屏蔽双绞线&…

json为全局变量 vue_vue 设置全局变量、指定请求的 baseurl

一. 基本环境前端vue:2.5.6axios:0.18使用vue脚手架构建项目。参照:webstorm搭建vue项目后台ssm框架前后端数据采用json格式传输二. 前端配置axios配置1.安装:npm install axios --save2.在所需组件中引入axios:import…

java 多项式拟合最多的项数_Matlab概率统计与曲线拟合

一、二项分布二项分布来源于伯努利试验 (事件发生概率 ) :含义为独立重复N次试验后, 事件总共发生k次的概率分布函数 二项分布记为 binopdf 获得事件共发生次的概率 binocdf 为事件最多发生次的概率 binornd 将生成一个服从二项分布 规模为 的随机矩阵二项分布的数字特征…

mysql -- MAC下安装配置mysql

1:进入官网,链接是 https://dev.mysql.com/downloads/mysql/ 点击第一个dmg文件,download 2:点击 No thanks, just start my download. 3:下载到本地到dmg文件 4:安装MySQL,双击 mysql.dmg 文件,进行安装。 注意:安装…

负载均衡配置与使用

Nginx负载均衡的理解 Nginx是一个轻量级的、高性能的WebServer,他主要可以干下面两件事: 作为http服务器(和apache的效果一样) 作为反向代理服务器实现负载均衡 现在Nginx到处都可以见到,经常会看到宕机后的网页会显示…

计算机网络基础:网络分类和拓扑结构知识笔记

​​​​​​​1、计算机网络分类 城域网、广域网、局域网网对比 网络分类 缩写 分布距离 计算机分布范围 传输速率范围 局域网 LAN 10、100、1000m左右 房间、楼寓、校园 4Mb/s- 1Gb/s 城域网 MAN 10KM左右 城市 50Kb/s-100Mb/s 广域网 WAN 100KM左右 国家或…

php发送数据到视图格式_PHP-FPM的相关知识的深度解释

一、需要搞清楚几个名词概念1. CGI(Common Gateway Interface,CGI)通用网关接口, 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CGI 应用程序能与浏览器进行交互,还可通过数据API与数据库服…

stm32超声波测距代码_干货!特斯拉Autopilot核心传感器解读超声波雷达篇

加入高工智能汽车行业群(自动驾驶行业4群,车联网智能座舱3群,智能商用车行业群),加微信:15818636852,并出示名片,仅限智能网联汽车零部件及OEM厂商。目前为止,特斯拉的Autopilot一共经历了三代硬…

记录

https://xclient.info/ https://www.macbl.com/ https://www.macwk.com/

进阶篇-安卓系统:2.多点触控的交互处理

1.android 触摸事件侦听 安卓的用户交互方式包括两种,一种是点击交互,一种是触摸交互。点击交互就是手指按下抬起一个动作组。而触摸交互分为按下(down),移动(move),抬起&#xff08…

计算机网络:网络设备知识笔记

网络设备是实现计算机网络实现用户通信和交互信息的硬件基础。常用的网络设备有中继器、网桥、路由器、集线器等。 1、网络传输介质互联设备 网络线路和用户节点具体衔接时,需要网络传输介质的互联设备。比如T型头(同轴电缆连接器)、收发器、…

执行git命令时提示秘钥权限太开放‘Permissions 0644 for ‘/Users/liuml/.ssh/id_rsa_tz‘ are too open.’

执行git命令时提示秘钥权限太开放‘Permissions 0644 for /Users/liuml/.ssh/id_rsa_tz are too open.’ 报错如下 这个问题是由于 权限的问题,需要文件设置权限: chmod 600 *

eclipse折叠if语句块_Python学习日志01判断 if 语句

1.条件判断语句(if语句)在python中,if语句就是用来进行判断的,语法如下:语法:If 条件表达式:代码块执行的流程:if语句在执行时,会先对条件表达式进行求值判断&#xff1b…

mysql怎么可视化连接_IDEA连接MySQL可视化工具连接操作

IDEA连接MySQL可视化工具连接操作入下所示:填写完成后,点击测试连接,连接成功如图所示点击OK即可报告错误(如图所示):[08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up. java.ne…