Почему мой код работает, когда я использую MessageBox.Show() между ними, и не работает без него?

StackOverflow https://stackoverflow.com/questions/909465

  •  05-09-2019
  •  | 
  •  

Вопрос

Я встроил WebBrowser .NET в форму, имеющую несколько других кнопок.

Приложение, которое я разрабатываю, не использует клавиатуру, а использует сенсорный экран.Так что на самом деле он использует только мышь.Для прокрутки веб-браузера вниз я сделал две специальные кнопки.Когда я нажимаю эти кнопки, он должен отправить в браузер нажатие клавиши «PageDown», и браузер должен прокрутить вниз.

Итак, код события клика выглядит следующим образом:

        theForm.Activate();
        Application.DoEvents();
        theBrowser.Focus();
        Application.DoEvents();
        SendKeys.Send(key);

Где «theForm» — это форма, а «theBrowser» — экземпляр браузера.

Поэтому, когда я нажимаю кнопку, ничего не происходит.Когда я сначала нажимаю на браузер, а затем нажимаю кнопку, он ДЕЙСТВИТЕЛЬНО работает.Но я уделяю этому внимание, верно?И я дал приложению достаточно места, чтобы установить фокус?

Но вот что мне кажется странным.Когда я помещаю MessageBox.Show("HELLO");в коде, вот так:

    theForm.Activate();
    Application.DoEvents();
    theBrowser.Focus();
    MessageBox.Show("HELLO");
    Application.DoEvents();
    SendKeys.Send(key);

...он работает сразу, когда я нажимаю кнопку.

 

Итак, вопрос:Почему этот код не работает, когда я не использую MessageBox.Show(), но работает, когда я использую MessageBox.Show()?

Надеюсь на вашу помощь, заранее спасибо...

Это было полезно?

Решение

Мне кажется, это неправильный подход.

Попробуйте что-нибудь в этом роде пример С++ или это образец С#.

По крайней мере, четко укажите HWND, которому вы отправляете сообщение, если собираетесь имитировать нажатия клавиш.

Другие советы

Не вдаваясь в то, правильный ли ваш подход.(и я подозреваю, что это не так).

Я готов поспорить, что у вас гонка.Это означает, что элементу управления браузера требуется больше времени для загрузки и реагирования на события, чем вы ему позволяете.

Поэтому, когда вы выполняете Message.Show, внезапно поток, в который вы отправляете события, блокируется и позволяет элементу управления браузером завершить инициализацию или что-то еще.

Из вашего вопроса трудно понять, используете ли вы мобильный телефон или обычный настольный компьютер, поскольку существуют более эффективные подходы к работе с сенсорным экраном.Посмотрите Window7 Api для multi Touch или WPF 4.0 (который также используется в Surface Touch SDK).

Надеюсь, это поможет.Ариэль

Возможно, элемент управления браузера все еще загружает документ, а окно сообщения дает ему достаточно времени для завершения.В этом случае подождите, пока свойство IsBusy браузера не станет ложным, или используйте событие DocumentCompleted.

Я не знаю, но в целом, по моему опыту, пытаться изменить фокус программно таким образом — плохая идея, вы всегда попадаете в поиск ошибок.Однако существует множество способов заставить окна прокручиваться, так что, может быть, вам стоит попробовать что-то еще?Например, JavaScript в веб-браузере может эффективно прокручивать окно.

Я подозреваю, что у вас здесь гонка, что сделать первым.Фокусирование элемента управления может быть не мгновенным, и отправленное вами нажатие клавиши будет направлено в другое место, тогда как после закрытия окна сообщения элемент управления браузера уже находится в фокусе и получает нажатие клавиши.

Кроме того, процитируем заметку из MSDN о Управление.Фокус():

Focus — это метод низкого уровня, предназначенный в первую очередь для авторов пользовательских элементов управления.Вместо этого программисты приложений должны использовать Выбирать метод или АктивКонтроль свойство для дочерних элементов управления или Активировать метод для форм.

Поэтому использование одного из них может быть лучше, чем использование Focus().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top