.NET WebBrowser控件中的Javascript键盘按键事件keyup/keydown

6
我有一个.NET WebBrowser控件,用于显示我编写的一些JavaScript重页面。这些页面使用YUI构建,并以可移植的方式构建。
我刚刚发现,虽然我可以在JavaScript中捕获按键,但似乎无法捕获keyup或keydown事件。这使我无法挂钩ESC、CTRL+A、UP、RIGHT、TAB等按键。
我知道我可以在.NET中捕获这些按键,并且有一些“hack”方法可以解决其中的一些问题。例如,对于CTRL+A,可以使用Document.ExecCommand("SelectAll",..,..)。顺便说一下,我仍然无法让SendKeys.Send("{TAB}")在tab键上起作用。我意识到我可以使用.NET来执行处理UP箭头的函数,但出于可移植性和最佳实践原因,我真的不想这样做。
有人能解释为什么我无法捕获JavaScript中的keyup/keydown事件,或者提供一个解决方法吗?
谢谢!
3个回答

2
我最近在使用ATL web浏览器控件(CAxHost)时遇到了这个问题。我不确定如何在winforms中解决,但您需要对浏览器对象进行IOleInPlaceActiveObject的QueryInterface,然后在调用消息循环中的TranslateMessage之前调用IOleInPlaceActiveObject::TranslateAccelerator。我认为在winforms中,这意味着将ActiveXInstance属性转换为IOleInPlaceActiveObject(您可能可以从pinvoke.net找到接口的定义)。
这通常只是让控件执行它的加速键(例如ctrl-p打印,F5刷新等),但似乎keydown事件也会触发此调用。如果您想阻止其中一些加速键,我认为您可以通过在浏览器的Ax主机中实现IDocHostUIHandler::TranslateAccelerator并检查正在测试的Ole命令来关闭它。

1

我尝试在一个WinForm应用程序中加载来自YUI的示例(h ttp://developer.yahoo.com/yui/examples/container/keylistener_clean.html),在其中我放置了一个WebBrowser控件,一切都运行良好。

该示例使用keyup事件,因此我认为它适合您的情况。

您可能需要检查您的WebBrowser控件正在以哪种模式运行http://blogs.msdn.com/ie/archive/2008/03/18/webbrowser-control-rendering-modes-in-ie8.aspx

马可


0

我写了一些代码来展示如何在JavaScript中捕获箭头键按下事件。我已经在IE和FireFox中测试过了,所以应该没问题...

<input id="Text1" type="text" onkeydown="keyPress(event)" />

<script type="text/javascript">
    function keyPress(e)
    {
        var textBox = document.getElementById('Text1');

        var keynum;

        if (window.event) // IE
            keynum = e.keyCode;
        if (e.which) // Other browser
            keynum = e.which;

        switch (keynum)
        {
            case 38:
                textBox.value = 'Up Arrow';
                break;
            case 37:
                textBox.value = 'Left Arrow';
                break;
            case 40:
                textBox.value = 'Down Arrow';
                break;
            case 39:
                textBox.value = 'Right Arrrow';
                break;
            default:
                textBox.value = 'Another key';
                break; 
        }
    }
</script>

希望它有帮助 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接