【问题标题】:Javascript keyup/keydown in .NET WebBrowser Control.NET WebBrowser 控件中的 Javascript keyup/keydown
【发布时间】:2009-07-04 17:38:08
【问题描述】:

我有一个 .NET WebBrowser 控件,我用它来显示一些我编写的大量 javascript 页面。这些页面使用 YUI,并且以可移植的方式构建。

我刚刚发现虽然我可以在 javascript 中捕获按键,但我似乎无法在 在 javascript 中捕获 keyup 或 keydown。例如,这可以防止我挂接 ESC、CTRL+A、UP、RIGHT、TAB。

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

谁能解释为什么我无法在 javascript 中捕获 keyup/keydown 事件或提出解决方法?

谢谢!

【问题讨论】:

    标签: c# .net javascript keyboard browser


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我试图从 yui (h ttp://developer.yahoo.com/yui/examples/container/keylistener_clean.html) 在一个 winForm 应用程序中加载这个示例,在该应用程序中我删除了一个 WebBrowser 控件并且一切正常。 该示例使用 keyup 事件,因此我认为它适合您的情况。

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

      马可

      【讨论】:

        【解决方案3】:

        我已经为您编写了一些代码来展示如何在 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>
        

        希望对你有帮助:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-18
          • 2014-06-12
          • 1970-01-01
          • 2013-05-05
          • 1970-01-01
          • 1970-01-01
          • 2013-04-27
          • 2011-12-17
          相关资源
          最近更新 更多