确保C#表单具有焦点

时间:2016-12-08 18:09:25

标签: c# forms focus webbrowser-control

我是Visual C#的新手,但已经在Delphi中编写了很长时间。我创建了一个隐藏了一个简单面板的表单,除非你在键盘上键入一个特定的键(我确实有" KeyPreview"为表单设置为true,我正在使用KeyDown事件来处理确定是否按下了正确的键并使面板可见/不可见)。在面板下方是一个webBrowser组件。

发生的事情如下:

当我的表单最初启动时,我会显示"显示"确保表单最初具有焦点的事件:

private void Form1_Shown(object sender, EventArgs e)
{
    if (!Focused)
    {
        Focus();
    }
}

当表格聚焦在这一点时,我的代码用于检测正确的按键以使面板显示或消失,效果很好。

这是事情变得奇怪的地方,我不知道该怎么做。我正在处理错误的两个部分:

  1. 如果我再次单击另一个表单然后再单击表单的标题栏以获得对我的表单的关注并尝试按键,则按键检测不起作用。但是,如果我再次单击另一个表单然后再返回我的表单,则表单的击键检测确实有效。我可以做些什么来确保每次我的焦点再次集中时它都有效?

  2. 如果我单击自己表单中的Web浏览器组件,表单的KeyDown代码将不再生效。即使我单击表单的标题栏,KeyDown事件也不起作用。我需要做些什么才能确保,如果单击表单中的某个组件,我的表单仍会响应KeyDown事件?

  3. 提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

我无法解释为什么你的标题栏似乎在拦截关键事件。可能是表单上的各种组件可以具有焦点并因此捕获键盘事件。我知道Web浏览器控件以这种方式工作。您可以考虑全局捕获键盘事件。

我在Codeproject上看到了一些显示如何执行此操作的内容。我希望这会有所帮助。

他们使用UserActivityHooks。

UserActivityHook actHook;
void MainFormLoad(object sender, System.EventArgs e)
{
   actHook= new UserActivityHook(); // crate an instance

// hang on events

   actHook.OnMouseActivity+=new MouseEventHandler(MouseMoved);
   actHook.KeyDown+=new KeyEventHandler(MyKeyDown);
   actHook.KeyPress+=new KeyPressEventHandler(MyKeyPress);
   actHook.KeyUp+=new KeyEventHandler(MyKeyUp);
}

至于webbrowser控件,当然它会触及键盘事件。用户通常必须在表单中输入文本,并且开发人员经常在网页上编写javascript以专门挂钩到键盘事件。因此,webbrowser控件必须能够捕获它们。