CTRL + TAB, когда веб-браузер в фокусе

У меня есть приложение для Windows с вкладкой. Одна из вкладок tabcontrol имеет элемент управления веб-браузера. Теперь проблема, с которой я столкнулся, заключается в том, что когда фокус находится внутри элемента управления веб-браузером, обычные функции Ctrl + Tab элемент управления вкладками не работает. Я хочу, чтобы Ctrl + вкладка изменял выбранную вкладку элемента управления вкладками, даже если фокус находится внутри элемента управления веб-браузером на выбранной вкладке. Как этого добиться?

Я уже пытался переопределить ProcessCmdKey. Но он не срабатывает, когда фокус находится внутри элемента управления веб-браузером.

Я также пробовал метод registerhotkey, он работает, но он блокирует горячую клавишу Ctrl + Tab в моем приложении, и система не реагирует ни на один другой Ctrl + Tab нажимается за пределами моего приложения, когда приложение работает, что является ожидаемым поведением registerhotkey.


person user435293    schedule 01.10.2012    source источник
comment
Если вы хотите отключить все ярлыки веб-браузера (control + N, backspace и т. Д.), Вы можете установить webBrowser.WebBrowserShortcutsEnabled   -  person Sheng Jiang 蒋晟    schedule 02.10.2012
comment
спасибо, Sheng. но я хочу, чтобы ярлыки в веб-браузере оставались активными. Я решил проблему, используя горячую клавишу для CTRl + TAB. Я отменяю регистрацию горячей клавиши, когда другое окно вызывает CTRL + TAB и снова регистрируется при активированном событии. Это может не быть идеальный подход, но пока работает.   -  person user435293    schedule 02.10.2012


Ответы (1)


Вот код, который вам нужен:

    If WB.ContainsFocus Then
        MsgBox("We have focus, disappearing...")
        WB.Document.Body.RemoveFocus()
    End If

Теперь вопрос в том, когда запускать этот код. Если вы поместите его в событие WebBrowser1_GotFocus, вам нужно будет включить и выключить его. Отключите код, если пользователь взаимодействует с элементом управления WB, и включите его снова, когда они этого не делают и когда вы ожидаете, что у вас возникнет проблема, о которой вы упомянули.

Конечно, вы можете добавить еще одну строку, чтобы убедиться, что определенный элемент управления / вкладка / панель и т. Д. Получает фокус после того, как вы удалите фокус из тела. Кроме того, вот еще 3 вопроса SO, ответы на которые могут вам помочь, но они приведут вас в направлениях, отличных от направления, которое я указал, вероятно, из-за того, что вопросы не идентичны вашим, но достаточно похожи быть полезным (не в порядке предпочтения).

Предотвратить кражу фокуса элементом управления WebBrowser?

Веб-браузер перехватывает фокус

Фокусировка элемента управления WebBrowser в приложении C #

ОБНОВЛЕНИЕ: я просто хотел добавить, вместо .Body.RemoveFocus () вы могли бы сделать это:

WB.Document.Body.Parent.RemoveFocus()

Что я предпочитаю, поскольку объект .Document не имеет явного метода .RemoveFocus для intellisense, который я получил в VS2012 RC. Вероятно, это относится к тегу HTML (а не к объекту .Document), и, поскольку тег html является единственным родительским элементом для тега body, это имеет смысл, и нет объекта "HTML", непосредственно доступного в intellisense под объектом, так как вы можете получить его другими способами, так что это просто удобнее делать таким образом.

Ура, и дайте мне знать, если вам понадобится дополнительная информация по чему-либо.

person Erx_VB.NExT.Coder    schedule 02.10.2012
comment
спасибо за Ваш ответ ! я обязательно попробую. пока я решил проблему, используя горячую клавишу для CTRl + TAB. Я отменяю регистрацию горячей клавиши, когда другое окно вызывает CTRL + TAB и снова регистрируется при активированном событии. Это может быть не идеальный подход, но работает сейчас. - person user435293; 02.10.2012
comment
@ user435293 Что ж, попробуйте, когда / если у вас будет время, так как это будет элегантный способ сделать что-то (дайте нам знать, как оно пойдет, если вы это сделаете), я ответил на ваш пост, потому что никто не делал этого, пока вы есть решение, это самое главное. Ваше здоровье. - person Erx_VB.NExT.Coder; 02.10.2012