在 编写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替换为要实现的功能即可。

winform中键盘和鼠标事件的捕捉和重写(转)的更多相关文章

  1. winform中键盘和鼠标事件的捕捉和重写

    在编写winform应用程序时,有时需要无论在哪个控件获取焦点时,对某一个键盘输入或者鼠标事件都进行同样的操作.比如编写一个处理图片的应用程序时,希望无论当前哪个控件获得焦点,当用户按上.下.左.右键 ...

  2. Selenium2+python自动化12-操作元素(键盘和鼠标事件)

    前言 在前面的几篇中重点介绍了一些元素的到位方法,到位到元素后,接下来就是需要操作元素了.本篇总结了web页面常用的一些操作元素方法,可以统称为行为事件 有些web界面的选项菜单需要鼠标悬停在某个元素 ...

  3. 自动化测试-8.selenium操作元素之键盘和鼠标事件

    前言 在前面的几篇中重点介绍了一些元素的定位方法,定位到元素后,接下来就是需要操作元素了.本篇总结了web页面常用的一些操作元素方法,可以统称为行为事件 有些web界面的选项菜单需要鼠标悬停在某个元素 ...

  4. 如何在ArcMap中监听键盘鼠标事件(转)

    如何在ArcMap中监听键盘鼠标事件(转) Link: http://www.cnblogs.com/dyllove98/p/3155551.html 昨天有个朋友想要实现一个功能,就是在ArcMap ...

  5. WPF之路-键盘与鼠标事件 - 简书

    原文:WPF之路-键盘与鼠标事件 - 简书 键盘事件 事件类型分为以下几个类型 生命周期事件:在元素加载与卸载的时候发生 鼠标事件:鼠标动作 键盘事件:键盘动作 手写笔事件:适用于win7以上的系统 ...

  6. Selenium2学习(八)-- 操作元素(键盘和鼠标事件)

    前言 在前面的几篇中重点介绍了一些元素的到位方法,到位到元素后,接下来就是需要操作元素了.本篇总结了web页面常用的一些操作元素方法,可以统称为行为事件 有些web界面的选项菜单需要鼠标悬停在某个元素 ...

  7. cocos2d-x 键盘和鼠标事件

    出了菜单可以响应用户事件外,cocos2d中的层(Layer)也可以响应事件.层能够自动响应窗口事件,这些事件主要是键盘和鼠标事件,cocos2d中事件处理是通过Pyglet的事件处理完成的. 1.键 ...

  8. Selenium2+python自动化12-操作元素(键盘和鼠标事件)【转载】

    前言 在前面的几篇中重点介绍了一些元素的到位方法,到位到元素后,接下来就是需要操作元素了.本篇总结了web页面常用的一些操作元素方法,可以统称为行为事件 有些web界面的选项菜单需要鼠标悬停在某个元素 ...

  9. Winform中设置ZedGraph鼠标悬浮显示举例最近曲线上的点的坐标值和X轴与Y轴的标题

    场景 Winform中设置ZedGraph鼠标双击获取距离最近曲线上的点的坐标值: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/ ...

随机推荐

  1. VS2013缺少报表工具

    问题1:缺少报表设计工具--即rdlc无法打开设计器 原因:缺少SQL Server Data Tools(SSDT)工具 解决:安装ssdt即可 SSDT下载地址:https://msdn.micr ...

  2. 库函数系统调用文件方式,王明学learn

    库函数系统调用文件方式 基于C函数库的文件编程是独立于具体的操作系统平台的,不管是在Windows.Linux还是其他的操作系统中,都是使用这些函数.使用库函数进行程序设计可提高程序的可移植性. 对于 ...

  3. 基于socket、多线程的客户端服务器端聊天程序

    服务器端: using System; using System.Windows.Forms; using System.Net.Sockets; using System.Net;//IPAddre ...

  4. 【T_SQL】 基础 续+++

    十五.T-SQL 编程 1.变量 (1)局部变量                    A.局部变量必须以标记@作为前缀 ,如@age.                    B.局部变量的使用也是先 ...

  5. 用户视角 vs 系统视角 看性能

    如何评价性能的优劣: 用户视角 vs. 系统视角 对于最终用户(End-User)来说,评价系统的性能好坏只有一个字——“快”.最终用户并不需要关心系统当前的状态——即使系统这时正在处理着成千上万的请 ...

  6. jsp网站环境搭建

    工具:tomcat7(exe安装版).jre7.javaxcms(安装版.非源码).mysql 1.先安装jre7,或者安装java7(自带了jre7) 2.安装tomcat7,期间要选择jre7安装 ...

  7. 判断网络是否连接 和 判断GPS是否连接

    //判断网络是否连接 public static Boolean isNetworkEnabled(Context context){ int status=-1  //设置默认连接的状态为-1 Co ...

  8. 苹果推送(APNs)ios push小结

    把app删除后就推送不成功了,可以看出deviceToken应该是设备+app来一起识别的,重新安装后仍然为同一个 简介 推送服务APNs(Apple Push Notification servic ...

  9. 【CLR Via C#】第5章 基元类型、引用类型、值类型

    第二遍看这本书,决定记录一下加深印象. 1,基元类型 什么事基元类型?基元类型是直接映射到FrameWork类库(FCL)中存在的类型,编译器直接支持的数据类型.比如int直接映射到System.In ...

  10. 最近点对问题 POJ 3714 Raid && HDOJ 1007 Quoit Design

    题意:有n个点,问其中某一对点的距离最小是多少 分析:分治法解决问题:先按照x坐标排序,求解(left, mid)和(mid+1, right)范围的最小值,然后类似区间合并,分离mid左右的点也求最 ...