.NET WebBrowser控件中的Javascript keyup / keydown

时间:2009-07-04 17:38:08

标签: c# .net javascript keyboard browser

我有一个.NET WebBrowser控件,用于显示我编写的一些javascript密集的页面。页面使用YUI,并以便携式构建。

我刚刚发现虽然我可以在javascript中捕获keypress,但我似乎无法在javascript中捕获keyup或keydown 。这可以防止我挂钩ESC,CTRL + A,UP,RIGHT,TAB等。

据我所知,我可以捕获.NET中的密钥,并且其中一些密钥存在“黑客”。例如,CTRL + A的Document.ExecCommand(“SelectAll”,..,..)。 ---顺便说一句,我仍然无法让SendKeys.Send(“{TAB}”)为标签工作---。我意识到我可以使用.NET来执行处理UP箭头的函数,但出于可移植性和最佳实践的原因,我真的不想这样做。

有人可以解释为什么我无法捕获javascript中的keyup / keydown事件 或建议解决方法吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

我自己使用ATL Web浏览器控件(CAxHost)遇到了这个问题。不知道如何在winforms中执行此操作,但您需要做的是关闭浏览器对象的IOleInPlaceActiveObject的QueryInterface,然后在消息循环中调用TranslateMessage之前调用IOleInPlaceActiveObject :: TranslateAccelerator。我认为在winforms中这意味着将属性ActiveXInstance转换为IOleInPlaceActiveObject(你可以从pinvoke.net找到接口的定义)

这应该只是让控件执行其加速器(如用于打印的ctrl-p,用于刷新的F5等),但是看起来keydown事件也是此调用的关键。如果你想阻止其中一些加速器,我想你可以通过在浏览器的Ax主机中实现IDocHostUIHandler :: TranslateAccelerator并检查正在测试的Ole命令将其关闭来实现。

答案 1 :(得分: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

答案 2 :(得分: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>

希望有所帮助:)