在表单具有焦点时捕获F1 KeyEvent。

时间:2015-05-15 20:37:29

标签: c# windows forms

无论当前焦点是什么,我都需要在触发时捕获F1 KeyEvent。目前我有一个基类,它定义了用于触发F1键盘的方法。在子类中,我正在侦听.KeyUp事件并将调用父级。

//基类:

protected void GetHelp(String helpIndexParam)
{
    // Logic
}

//儿童班:

//Declared in constructor of child class
KeyPreview = true;
this.KeyUp += new System.Windows.Forms.KeyEventHandler(KeyEvent);

private void KeyEvent(object sender, KeyEventArgs e)
{   
   if (e.KeyCode == Keys.F1)
   {
       base.GetHelp("20");
   }
}

目前,子表单打开,我按F1,没有任何反应。只有当我单击窗体上的控件然后按F1时才会执行GetHelp("")功能。

任何建议表示赞赏。干杯。

2 个答案:

答案 0 :(得分:1)

在这种情况下,您可以在父表单或每个子表单中使用ProcessCmdKey方法:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    if (keyData == Keys.F1) {
         // Show help;
         return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

或者,由于您正在寻找F1键,您可以使用HelpRequest事件:

public Form1() {
   InitializeComponent();
   this.HelpRequested += Form1_HelpRequested;
}
private void Form1_HelpRequested(object sender, HelpEventArgs hlpevent) {
   // Show Help
}

答案 1 :(得分:0)

我能够让它运转起来。我了解到,因为我们正在使用MDI,所以MDI本身显然正在消耗任何在儿童表单中捕获F1点击的尝试。我基本上必须设置它,以便KeyUp事件在父表单中定义而不是子表单,子表单只是从父表单填充所需的属性。这就是我如何将必要的信息传递给父母的方式。此外,我不得不把注意力集中在对儿童表单的控件上,以便整个事情可以结合在一起。

我感谢所有帮助人员。从长远来看,你们都指出了正确的道路。干杯。