我现在已经阅读了一些有关按键事件的文章,但我不知道如何获取它们。我知道只有当前具有键盘焦点的控件才能获取按下事件。但我如何确保我的用户控件拥有它?
尝试过这个但没有运气:
public partial class Editor : UserControl
this.SetStyle(ControlStyles.Selectable, true);
this.TabStop = true;
...
//take focus on click
protected override void OnMouseDown(MouseEventArgs e)
{
this.Focus();
base.OnMouseDown(e);
}
...
protected override bool IsInputKey(Keys keyData)
{
return true;
}
还有这个:
//register global keyboard event handlers
private void Editor_ParentChanged(object sender, EventArgs e)
{
if (TopLevelControl is Form)
{
(TopLevelControl as Form).KeyPreview = true;
TopLevelControl.KeyDown += FCanvas_KeyDown;
TopLevelControl.KeyUp += FCanvas_KeyUp;
TopLevelControl.KeyPress += FCanvas_KeyPress;
}
}
后者给了我按键按下和按键向上事件,但仍然没有按键。当我的控件继承自 UserControl 时,是否有任何其他方法可以用来获取每个向下/向上/按下事件?
编辑:
正如有一条评论链接了另一个 SO 问题:重要的是我还获得了 KeyPress 事件,因为无论哪种语言,它都会在每个键盘上发送正确的字符。这对于文本写作很重要。如果您只获得单个密钥,则必须自行将它们处理为正确的字符。但也许有一种方便的方法可以将按下的按键转换为本地化字符?
- 设置您的父表单(包含用户控件)
KeyPreview
财产给true
- 添加新的
KeyPress
向您的家长表格发送事件
设置父窗体按键事件以将事件转发到您的用户控件:
private void parentForm_KeyPress(object sender, KeyPressEventArgs e)
{
// Forward the sender and arguments to your usercontrol's method
this.yourUserControl.yourUserControl_KeyPress(sender, e);
}
更换yourUserControl1_KeyPress
方法与您自己的方法,您希望在每次用户按下按钮(按下按钮然后释放)时运行该方法。
您还可以为用户控件创建一个新的 KeyPress 处理程序,并在那里转发发送者和 KeyPressEventArgs 对象,如本例所示。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)