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

Я встроил Web-браузер .NET в форму, имеющую некоторые другие кнопки.

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

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

        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);

... работает сразу после нажатия кнопки.

& NBSP

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

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

Ответы [ 5 ]

1 голос
/ 26 мая 2009

Для меня это выглядит как неправильный путь.

Попробуйте что-то вроде этого C ++ образца или этого C # образца .

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

1 голос
/ 26 мая 2009

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

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

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

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

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

0 голосов
/ 26 мая 2009

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

Также, процитирую заметку из MSDN о Control.Focus () :

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

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

0 голосов
/ 26 мая 2009

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

0 голосов
/ 26 мая 2009

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

...