我有一个.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事件 或建议解决方法吗?
谢谢!
答案 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>
希望有所帮助:)