2009-07-04 16 views
6

Tengo un control .NET WebBrowser que estoy usando para mostrar algunas páginas javascript pesadas que he escrito. Las páginas usan YUI y se han creado de forma portátil.Javascript keyup/keydown en .NET WebBrowser Control

Acabo de descubrir que, si bien puedo capturar la pulsación de teclas en javascript, parece que no puedo capturar keyup o keydown en javascript. Esto me impide enganchar ESC, CTRL + A, UP, RIGHT, TAB, por ejemplo.

Entiendo que puedo capturar las claves en .NET, y que hay 'hacks' para algunos de estos. Por ejemplo, Document.ExecCommand ("SelectAll", .., ..) para CTRL + A. --- Por cierto, todavía no puedo obtener SendKeys.Send ("{TAB}") para trabajar para tab ---. Me doy cuenta de que puedo usar .NET para ejecutar una función que procesa la flecha ARRIBA, pero por razones de portabilidad y mejores prácticas, realmente no quiero hacer esto.

¿Alguien puede explicar por qué no puedo capturar los eventos de keyup/keydown en javascript o sugerir una solución?

Gracias!

Respuesta

0

Le he escrito un poco de código para mostrar cómo capturar la tecla de flecha presionar en JavaScript. He probado esto en IE y Firefox por lo que debe estar bien ...

<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> 

espero que ayude :)

1

Me trataron de cargar este ejemplo de Yui (h ttp: //developer.yahoo. com/yui/examples/container/keylistener_clean.html) en una aplicación winForm en la que dejé caer un control WebBrowser y todo funciona bien. El ejemplo usa el evento de teclado, así que creo que se ajusta a su caso.

Es posible que desee comprobar en qué modo en el que se está ejecutando el control WebBrowser http://blogs.msdn.com/ie/archive/2008/03/18/webbrowser-control-rendering-modes-in-ie8.aspx

Marco

2

acabo de encontrar con este problema a mí mismo con el control ATL navegador web (CAxHost). No estoy seguro de cómo hacer esto en winforms, pero lo que necesita hacer es QueryInterface para IOleInPlaceActiveObject fuera del objeto del navegador y luego llamar a IOleInPlaceActiveObject :: TranslateAccelerator antes de llamar a TranslateMessage en su ciclo de mensajes. Creo que en winforms esto significa convertir la propiedad ActiveXInstance a IOleInPlaceActiveObject (probablemente pueda encontrar una definición de la interfaz de pinvoke.net)

Esto debería ser solo para dejar que el control haga sus aceleradores (como ctrl-p para imprimir , F5 para actualizar, etc.), pero parece que los eventos de tecla también activan esta llamada. Si desea bloquear algunos de estos aceleradores, creo que puede hacerlo implementando IDocHostUIHandler :: TranslateAccelerator en el host de Ax del navegador y comprobando el comando Ole que se está probando para desactivarlo.

Cuestiones relacionadas