Веб-браузер ворует фокус - PullRequest
4 голосов
/ 14 декабря 2011

Я использую веб-браузер в моем приложении winforms (c #). И когда он занимается автоматизацией, я теряю контроль фокуса из окна, с которым работал. Форма веб-браузера также не появляется, я просто теряю фокус из-за контроля. Я сейчас пишу это сообщение, я должен снова и снова нажимать в текстовое поле ...

Как отключить такое поведение в веб-браузере?

Я создаю невидимый веб-браузер так:

var br = new WebBrowser();
br.Visible = false;
br.ScriptErrorsSuppressed = true;

Пожалуйста, сообщите.

Ответы [ 7 ]

15 голосов
/ 24 октября 2012

У меня была та же проблема:

Веб-браузер Control украл фокус из приложения после загрузки URL.

Это сработало для меня:

  1. ДоДля вызова метода Webbrowser.Navigate() установите родительский элемент управления веб-браузера на Enabled = false.
  2. В случае события DocumentCompleted веб-браузера установите для родительского элемента управления веб-браузера значение Enabled = true.
2 голосов
/ 26 сентября 2014

Я смотрел на все остальные ответы на этот вопрос, и они не работали для меня, но я видел один о настройках Browser.Parent.Enabled = false; Я попробовал так и получил ошибку, так что я попробовал это вместо этого просто пришло в голову.

Browser.Parent = new Control();

Browser.Parent.Enabled = false;

И теперь проблема полностью исчезла, она больше не убирает фокус. Я использую класс веб-браузера как переменную, его нет в моей форме. ну, это сработало для меня, попробуйте, похоже, это 100% решение.

2 голосов
/ 18 апреля 2013

это очень сложная проблема, которую нужно решить, и она должна быть пересмотрена Microsoft, приложение, просто крадущее фокус, нелогично, хотя оно зависит от того, что делает веб-сайт. Мне пришлось прибегнуть к фильтру CBT, см. http://msdn.microsoft.com/en-us/magazine/cc188966.aspx, и отфильтровать нежелательные HCBT_ACTIVATE и HCBT_SETFOCUS (возвращение 1;). Вы можете использовать GetWindowClass (wParam), чтобы увидеть, что происходит.

Даже выше не работало полностью, окно приложения все равно временно выходило на передний план, так что обходилось с помощью SetWindowPos HWND_TOPMOST и HWND_NOTOPMOST в окне, которое в настоящее время находится на переднем плане. HCBT_SETFOCUS получает удар 2 или 3 раза, поэтому при первом наборе HWND_TOPMOST и последнем наборе HWND_NOTOPMOST. Посчитайте, сколько classname == «Internet Explorer_Server», которое должно быть 2 (или, возможно, зависит от веб-сайта?), Другое - «Вложение оболочки», но это не всегда происходит. Надеюсь, это поможет.

2 голосов
/ 14 декабря 2011

Я думаю, WebBrowser получает фокус после загрузки страницы, вызывая Navigate (или метод Click для HtmlElement, который вызывает навигацию).Фокус может быть возвращен элементу управления в окне (TextBox) в DocumentComplete обработчике события WebBrowser, но это очень сложно:

  1. КогдаВы бы определили, какой контроль изначально принадлежал фокусу?Перед звонком Navigate?Этого недостаточно, потому что пользователь может перейти к другому элементу управления после вызова Navigate, но перед обработкой DocumentComplete.

  2. AFAIK установив фокус на TextBox, выберет еговесь контент, так что вам придется вернуть курсор в исходное положение.Но когда бы вы сохранили исходную позицию?Та же проблема.

  3. После одного Navigate (или Click) может быть несколько событий DocumentComplete.

ВозможноРешением будет создание отдельного приложения для вашего скрытого WebBrowser.Это второе приложение будет невидимым и может обмениваться данными с исходным приложением с графическим интерфейсом с использованием некоторой технологии InterProcess Communication (IPC).Поскольку WebBrowser в этом случае будет выполняться в другом процессе, у вас будет больше шансов не потерять фокус и беспокоить пользователя.

2 голосов
/ 14 декабря 2011

Вы можете попробовать отключить его глобально через API SystemParametersInfo . Используйте SPI_SETFOREGROUNDLOCKTIMEOUT. Настройка блокировки переднего плана является глобальной настройкой, поэтому вы захотите очистить эту настройку, когда закончите. Более постоянным решением является изменение ключа реестра HKCU \ Control Panel \ Desktop \ ForegroundLockTimeout . См. Также это обсуждение на сайте social.msdn (в частности, ответ billb08).

0 голосов
/ 12 сентября 2017

Мое решение для отправки фокуса обратно в форму:

        Private Sub Web_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles Web.DocumentCompleted
    If Me.Visible = False Then
        For Each f As Form In My.Application.OpenForms
            If TypeOf f Is frmLogin Then
                Dim fl As frmLogin = DirectCast(f, frmLogin)
                If fl.Visible = True Then
                    fl.Focus()
                    Exit For
                End If
            End If
        Next
    End If
End Sub
0 голосов
/ 09 октября 2016
Most of the methods won't work for me on more than one web browser. This method is work with any amount of web browsers;

1. Put web browser into a panel and set panel enabled to false, then navigate;

    webBrowser.Parent = panelBottom;
    panelWebBrowser.Enabled = false;
    webBrowser.Navigate("http://www.google.com");

2. Define a navigated event to web browser and delay panels enabling for a second;

    private void webBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
    {
        System.Threading.Timer timer = null;
        timer = new System.Threading.Timer((obj) =>
        {
            panelWebBrowser.Enabled = true;
            timer.Dispose();
        },null, 1000, Timeout.Infinite);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...