在WebBrowser获得焦点后,取回键盘事件

本文关键字:键盘 事件 WebBrowser 焦点 | 更新日期: 2023-09-27 18:11:12

我有一个情况,我想使用WFP WebBrowser,但当用户按下一个按钮一些发生;然而,WebBrowser获得焦点后,一些键盘和鼠标事件不再在我的应用程序中触发。

要复制:创建一个新项目,设置XAML:

<Window x:Class="ProblemKeyboard.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <WebBrowser x:Name="browser" Height="177" HorizontalAlignment="Left" Margin="12,12,0,0" VerticalAlignment="Top" Width="479" />
    </Grid>
</Window>

,让代码覆盖OnKeyDown()事件。

public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
        browser.Navigate("http://www.google.com");
        //The above line causes browser to focus 
        //and as a consequence the OnKeyDown() handler 
        //doesn't get called again
    }
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.Key == Key.Enter) MessageBox.Show("Yey!");
        base.OnKeyDown(e);
    }
}

好的,可以理解用户可能想要输入他的Google查询。但在某种程度上,我想重新获得控制权。为此,我设计了一个按钮。当你点击这个按钮时,我想让键盘控制回到WPF应用程序。但是不管这个按钮做什么,我不能让OnKeyDown()再次开火。

我的特殊限制允许在此时销毁WebBrowser。我尝试清除其父容器,尝试调用Dispose()和垃圾收集器。尝试Focus()对具有该功能的东西。一切似乎都无法控制。

我宁愿避免产生新的Window()或类似的解决方案。

编辑

我发现放一个TextBox并使它聚焦让我重新聚焦!然而,我的窗口中没有文本框,添加一个文本框只是为了笑,似乎是违反直觉的。

编辑2

当前的临时解决方案放置了一个不可见的(好吧,有点,它只是0 × 0, Visibility.Hidden不起作用)TextBox -启用它,聚焦它并禁用它。如果不首先禁用它,一些键由TextBox处理,而不是冒泡到KeyDown()

在WebBrowser获得焦点后,取回键盘事件

是的,它是可复制的Enter键,修复是使用OnKeyUp()为Enter键....

    protected override void OnKeyUp(KeyEventArgs e)
    {
        if (e.Key == Key.Enter) MessageBox.Show("Hi");
        base.OnKeyUp(e);
    }