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

2

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

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

Таким образом, код события click следующий:

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

Где "форма" - это форма, а "theBrowser" - это экземпляр браузера.

Поэтому, когда я нажимаю кнопку, ничего не происходит. Когда я сначала нажимаю на браузер, а затем нажимаю кнопку, он работает. Но я даю ему право фокусироваться? И я дал приложению достаточно места, чтобы установить фокус?

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

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

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

&nbsp

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

Надеюсь, ты сможешь помочь, спасибо заранее...

  • 0
    Даже если я позволю странице полностью загрузиться, то же самое происходит ...
Теги:
messagebox

5 ответов

1
Лучший ответ

Мне кажется, что это не так.

Попробуйте что-то по строкам этого образец С++ или Пример С#.

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

  • 0
    Этот пример C # действительно очень помог! Спасибо!
  • 0
    Пример ссылки на C # теперь не работает.
1

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

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

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

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

Надеюсь, что это поможет. Ariel

0

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

0

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

0

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

Кроме того, чтобы процитировать заметку из MSDN о Control.Focus():

Фокус - это низкоуровневый метод, предназначенный в первую очередь для авторов пользовательского контроля. Вместо этого прикладные программисты должны использовать метод Select или ActiveControl для дочерних элементов управления или метод Activate для форм.

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

  • 0
    Разве Application.DoEvents () не должен позаботиться об этом? Я имею в виду, что я получил что-то среднее, так что у меня есть время, чтобы сосредоточиться на контроле

Ещё вопросы

Сообщество Overcoder
Наверх
Меню