c#WinForm鼠标和键盘触发事件问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#WinForm鼠标和键盘触发事件问题相关的知识,希望对你有一定的参考价值。

假设我有一个登陆按钮,我想当键盘按下Enter或者鼠标按下时执行同一样的事件,有什么方法可以简单的实现,需要两个分开写?

通常来说,要对某个控件进行按键屏蔽,可以处理keypress事件,将keyeventargs.handled属性设为true;或是重载preprocessmessage函数。
若要是屏蔽dialog字符的话,可以重载control.processdialogkey函数。
若要对整个程序进行按键屏蔽,可以创建程序级的hook,或是对所有的控件都加上一个keypress事件处理函数。
参考技术A 首先你是有一个登陆按钮的对吧.
假定这个按钮叫做"button1"
你在button1的Click事件里写上登陆方法.
好的,现在鼠标按下登陆解决了.
然后你选中你的窗体=>属性
设置accptButton属性,在选择框中选中Button1按钮
设置KeyPreView属性为"False"
现在你在页面上按下Enter键就相当于选中了Button1按钮了.
参考技术B 不用分开写,因为你做的是同一件事情,只需把鼠标按下和键盘回车按下绑定到你定义好的事件里就可以了,这样无论你是鼠标按下还是键盘回车按下 都会自动执行你定义好的事件,这是委托实现的功能。 参考技术C 不用分开写,一个事件就够了 不过Enter 或者鼠标事件都要手动绑定你写的方法

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

  

  

以上是关于c#WinForm鼠标和键盘触发事件问题的主要内容,如果未能解决你的问题,请参考以下文章

C#WinForm中如何判断鼠标是不是在某个控件以外按下

C# mouseUp事件

jquery次考试 50/38

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

c#winform关闭事件

C# WinForm键盘钩子