在编写Winform应用程序时,有时无论哪个控件获得焦点,都必须对特定的键盘输入或鼠标事件执行相同的操作。例如,在编写处理图片的应用程序时,希望无论当前哪个控件都具有焦点,当用户向上,向下,向左或向右按下时,图片控件的滚动条都将上下移动,左和右。当用户移动鼠标滚轮时,图片始终为“放大或缩小”。如果设置了每个控件的键盘或鼠标事件,将不可避免地导致大量重复工作。在本文中,我将介绍如何在winform下对某些键盘输入或鼠标事件执行相同的操作。
1、键盘事件捕获和重写
首先,键盘操作。为了实现上述功能,我们现在介绍一种winform方法。 ProcessCmdKey。其msdn描述的地址为:msdn ProcessCmdKey简介
从函数名称可以看出,这实际上是设置winform快捷键的函数。
“在消息预处理期间调用此方法以处理命令键。命令键是始终比常规输入键具有优先级的键。命令键的示例包括快捷键和菜单快捷键。此方法必须返回true,以指示已处理命令键,或者为false表示该键不是命令键。仅当控件托管在Windows Forms应用程序中或充当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应用程序的window类中,然后将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替换为要在特定应用程序中实现的功能。
与该博客相对应的示例的下载地址为:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-371638-1.html
改是用国货自豪的时候了
永远挺你