捕捉F1 keyeevent时,形式有焦点

本文关键字:焦点 F1 keyeevent 捕捉 | 更新日期: 2023-09-27 17:49:14

我需要在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("")函数才会执行。

感谢任何建议。欢呼。

捕捉F1 keyeevent时,形式有焦点

在这种情况下,您可以在父表单或每个子表单中使用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
}

我能让它工作。我了解到,因为我们使用的是MDI,所以MDI本身显然会消耗子窗体中捕获F1单击的任何尝试。我基本上必须设置它,以便在父窗体中定义KeyUp事件,而不是在子窗体中定义KeyUp事件,并且子窗体将简单地从父窗体中填充所需的属性。这就是我如何将必要的信息传递给家长的。此外,我必须将焦点设置在子窗体上的控件上,这样整个事情就可以结合在一起了。

我感谢所有的帮助伙计们。从长远来看,你们都为我指明了正确的道路。欢呼。