2009-07-04 2 views
6

У меня есть элемент управления .NET WebBrowser, который я использую для отображения некоторых написанных javascript страниц. Страницы используют YUI и были созданы таким образом, чтобы быть портативными.Javascript keyup/keydown в .NET WebBrowser Control

Я только что обнаружил, что, хотя я могу захватить keypress в javascript, я не могу захватить keyup или keydown в javascript. Это мешает мне подключить ESC, CTRL + A, UP, RIGHT, TAB, например.

Я понимаю, что могу захватить ключи в .NET и что для некоторых из них есть «хаки». Например, Document.ExecCommand («SelectAll», .., ..) для CTRL + A. --- Кстати, я все еще не могу получить SendKeys.Send ("{TAB}") для работы на вкладке ---. Я понимаю, что я могу использовать .NET для выполнения функции, которая обрабатывает стрелку ВВЕРХ, но по соображениям мобильности и передовой практики я действительно не хочу этого делать.

Может кто-нибудь объяснить, почему я не могу захватить события keyup/keydown в javascript или предложить обходное решение?

Спасибо!

ответ

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> 

Надеется, что это помогает :)

1

Я пытался загрузить этот пример из Юи (ч 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

Marco

2

Просто столкнулся с этой проблемой сам с контролем АТЛ веб-браузер (CAxHost). Не уверен, как это сделать в winforms, но вам нужно выполнить QueryInterface для IOleInPlaceActiveObject с объекта браузера, а затем вызвать IOleInPlaceActiveObject :: TranslateAccelerator до вызова TranslateMessage в вашем контуре сообщения. Я думаю, что в winforms это означает, что листинг свойства ActiveXInstance для IOleInPlaceActiveObject (вы, вероятно, найдете определение интерфейса от pinvoke.net)

Это должно быть только для того, чтобы позволить контроллеру делать свои ускорители (например, ctrl-p для печати , F5 для обновления и т. Д.), Но, похоже, события keydown также отключают этот вызов. Если вы хотите заблокировать некоторые из этих ускорителей, я думаю, вы можете сделать это, выполнив IDocHostUIHandler :: TranslateAccelerator в узле хоста браузера и проверив проверку команды Ole, чтобы отключить ее.