首页 > 开发 > 综合 > 正文

C#处理鼠标和键盘事件

2024-07-21 02:18:19
字体:
来源:转载
供稿:网友

在程序运行中,产生事件的主体有很多,其中尤其以键盘和鼠标为最多。本文就来探讨一下在c#中和这二个主体相关的事件的处理过程。

  一.本文介绍的程序设计和运行的软件环境:

  (1).微软公司视窗2000服务器版

  (2)..net framework sdk beta 2

  二.c#中处理鼠标相关的事件:

  鼠标相关的事件大致有六种,分别是 :

    "mousehover"、"mouseleave"、"mouseenter"、"mousemove"、"mousedown"和"mouseup"。

  (1).如何在c#程序中定义这些事件:

  在c#中是通过不同的delegate来描述上述事件,其中描述"mousehover"、"mouseleave"、"mouseenter"事件的delegate是"eventhandler",而描述后面的三个事件的delegate是"mouseeventhandler"来描述。这二个delegate分别被封装在不同的命名空间,其中"eventhandler"被封装在"system"命名空间;"mouseeventhandler"被封装在"syetem.windows.froms"命名空间中的。在为"mousehover"、"mouseleave"、"mouseenter"事件通过数据的类是"eventargs",他也被封装在"system"命名空间中;而为后面的三个事件提供数据的类是"mouseeventargs",他却被封装在"syetem.windows.froms"命名空间。以上这些就决定了在c#中定义这些事件和响应这些事件有着不同的处理办法。下面就来介绍这些不同点。


  对于上述的前三个事件,是用以下语法来定义的:

   "组件名称"."事件名称"+= new system.eventhandler("事件名称");

  下面是程序中具体实现代码:

   button1.mouseleave += new syetem.evenhandler(button1_mleave);

  在完成了事件的定义以后,就要在程序中加入响应此事件的代码,否则程序编译的时候会报错。下面是响应上面事件的基本结构。

private void button1_mleave ( object sender , system.eventargs e )
{
此处加入响应此事件的代码
}

  定义"mousemove"、"mousedown"和"mouseup"事件的语法和前面介绍的三个事件大致相同,具体如下:

   "组件名称"."事件名称"+= new system.windows.forms. mouseeventhandler("事件名称");

  下面是程序中具体实现代码:

button1.mousemove += new system.windows.forms.mouseeventhandler(button1_mmove);

  下面是响应上面事件的基本结构:

private void button1_mmove ( object sender , system.windows.forms. mouseeventargs e )
{
此处加入响应此事件的代码
}

  注释:在上述程序中的"button1"是定义的一个按钮组件。


2).鼠标相关事件中的典型问题处理办法:

  在掌握了c#中定义和鼠标相关的事件,我们就来探讨一下和鼠标相关事件的典型问题。其一是读取鼠标的当前位置;其二是判定到底是那个鼠标按键按动。

  判定鼠标的位置可以通过事件"mousemove"来处理,在"mouseeventargs"类中提供了二个属性"x"和"y",来判定当前鼠标纵坐标和横坐标。而判定鼠标按键的按动情况,可以通过事件"mousedown"来处理,并且在"mouseeventargs"类中也提供了一个属性"button"来判定鼠标按键情况。根据这些知识,可以得到用c#编写的读取鼠标当前位置和判定鼠标按键情况的程序代码。下面就是此代码(mouse.cs)和此代码编译后运行界面:


  mouse.cs的源程序代码如下:

using system ;
using system.drawing ;
using system.collections ;
using system.componentmodel ;
using system.windows.forms ;
using system.data ;
public class form1 : form
{
private system.componentmodel.container components = null ;
public form1 ( )
{
file://初始化窗体中的各个组件
initializecomponent ( ) ;
}
file://清除程序中使用过的资源
protected override void dispose ( bool disposing )
{
if ( disposing )
{
if (components != null)
{
components.dispose ( ) ;
}
}
base.dispose ( disposing ) ;
}
private void initializecomponent ( )
{
this.autoscalebasesize = new system.drawing.size ( 6 , 14) ;
this.clientsize = new system.drawing.size ( 292 , 273 ) ;
this.name = "form1" ;
this.text = "c#处理鼠标按动事件!" ;
file://为鼠标按动定义一个事件处理过程"form1_mousedown"
this.mousedown += new mouseeventhandler ( form1_mousedown ) ;
file://为鼠标移动定义一个事件处理过程"form1_mousemove"
this.mousemove += new mouseeventhandler ( form1_onmousemove ) ;

}
static void main ( )
{
application.run ( new form1 ( ) ) ;
}
private void form1_onmousemove ( object sender , mouseeventargs e )
{
this.text = "当前鼠标的位置为:( " + e.x + " , " + e.y + ")" ;
}

private void form1_mousedown ( object sender , mouseeventargs e )
{
file://响应鼠标的不同按键
if ( e.button == mousebuttons.left )
{
messagebox.show ( "按动鼠标左键!" ) ;
}
if ( e.button == mousebuttons.middle )
{
messagebox.show ( "按动鼠标中键!") ;
}
if ( e.button == mousebuttons.right )
{
messagebox.show ( "按动鼠标右键!") ;
}
}
}


三.c#中处理和键盘相关的事件:

  在c#中和键盘相关的事件相对比较少,大致就三种:"keydown"、"keyup"和"keypress"。

  (1).如何在c#程序中定义这些事件:
 
  c#中描述"keydown"、"keyup"的事件的delegate是"keyeventhandler"。而描述"keypress"所用的delegate是"keypresseventhandler"。这二个delegate都被封装在命名空间"syetem.windows.froms"中。为"keydown"、"keyup"的事件提供数据的类是"keyeventargs"。而为"keypress"事件提供数据的类是"keypresseventargs"。同样这二者也被封装在命名空间"syetem.windows.froms"中。

  在c#程序定义"keydown"、"keyup"事件的语法如下:

   "组件名称"."事件名称"+= new syetem.windows.froms. keyeventhandler("事件名称");

  下面是程序中具体实现代码:


button1. keyup += new syetem.windows.froms. keyeventhandler(button1_kup);

  下面是响应上面事件的基本结构。


private void button1_kup ( object sender , syetem.windows.froms. keyeventargs e )
{
此处加入响应此事件的代码
}

  在c#程序定义"keypress"事件的语法如下:

   "组件名称"."事件名称"+= new syetem.windows.froms. keypresseventhandler("事件名称");

  下面是程序中具体实现代码:


button1. keypress += new syetem.windows.froms. keypresseventargs(button1_kpress);

  在完成了事件的定义以后,就要在程序中加入响应此事件的代码,否则程序编译的时候会报错。下面是响应上面事件的基本结构。


private void button1_kpress ( object sender , syetem.windows.froms. keypresseventargs e )
{
此处加入响应此事件的代码
}

  注释:程序中出现的"button1"是定义的一个按钮组件。

(

2).和键盘相关事件中的典型问题处理办法:

  和键盘相关的典型问题无非就是判定到底是哪个按键被按动。通过上面的三个事件都可以完成。并且在"keyeventargs"类中通过了一个属性"keycode",可以用他来读取当前按键。所以就在"keyup"或者"keydown"事件中处理这个问题。根据上面这些知识,可以得到用c#编写读取读取按键的程序代码,下面就是此代码(key.cs)和此代码运行后的界面: 

图02:用c#读取键盘按键的程序运行界面

  key.cs的代码如下:


using system ;
using system.drawing ;
using system.collections ;
using system.componentmodel ;
using system.windows.forms ;
using system.data ;
public class form1 : form
{
private system.componentmodel.container components = null ;

public form1 ( )
{
file://初始化窗体中的各个组件
initializecomponent ( ) ;
}
protected override void dispose ( bool disposing )
{
file://清除程序中使用过的资源
if ( disposing )
{
if ( components != null )
{
components.dispose ( ) ;
}
}
base.dispose ( disposing ) ;
}
private void initializecomponent ( )
{
this.autoscalebasesize = new system.drawing.size ( 6 , 14 ) ;
this.clientsize = new system.drawing.size ( 292 , 273 ) ;
this.name = "form1" ;
this.text = "c#处理键盘事件!" ;
file://为按键的按动定义一个事件处理过程"form1_keyup"
this.keyup += new keyeventhandler ( this.form1_keyup ) ;

}
static void main ( )
{
application.run ( new form1 ( ) ) ;
}
file://显示你所按动的按键名称
private void form1_keyup ( object sender , keyeventargs e )
{
messagebox.show ( e.keycode.tostring ( ) , "您所按动的健为:" ) ;

}
}

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表