Как заблокировать ввод с клавиатуры и мыши в мое приложение WinForms? - PullRequest
2 голосов
/ 25 августа 2009

У меня есть приложение WinForms, которое извлекает данные из веб-службы в рабочем потоке, и мне нужно отключить весь ввод данных в мое приложение, пока данные не будут загружены.

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

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

ОБНОВЛЕНИЕ: я должен был упомянуть, что мы рассмотрели модальный диалог. В настоящее время мы показываем наложение, запускаем поток доступа к данным, затем создаем форму. Если нет лучшего способа заблокировать ввод (App.BlockInput () может быть хорошим), тогда мы могли бы использовать модальную идею диалога, но нам нужно было бы подождать, пока построение формы не будет завершено, и в настоящее время нет хорошего, центрального место для этого.

Ответы [ 5 ]

4 голосов
/ 25 августа 2009

Вы можете отобразить небольшую модальную (modalForm.ShowDialog(yourForm)) форму с индикатором выполнения, прокручивающимся поверх вашего приложения. Это не приведет к перерисовке больших областей.

3 голосов
/ 15 сентября 2009

Использование Application.AddMessageFilter может сделать это: Захват событий мыши от каждого компонента в C # WInForm

3 голосов
/ 25 августа 2009

Если ваше приложение действительно заблокировано во время выполнения операции, я бы сделал то, что часто делает Microsoft: откройте модальное диалоговое окно с какой-то пульсирующей анимацией или ProgressBar и кнопку «Отмена». Перерисовка ограничена, потому что вы рисуете только размер нового диалога, а ввод в остальную часть вашего приложения блокируется, потому что диалог модальный. Кроме того, пользователи гораздо охотнее ждут, когда у вас появятся какие-то обновления статуса и / или анимации, потому что похоже, что компьютер «работает».

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

Обновление : с тех пор как вы изменили вопрос: сколько времени занимает создание модального диалога? Почему бы просто не создать пустой диалог, а затем заполнить его элементы управления? Если все, что у вас есть, это маленькое диалоговое окно с одной кнопкой и одной ProgressBar, то вызов dialog.ShowDialog () должен произойти быстрее, чем ваш пользователь может взаимодействовать с вашим пользовательским интерфейсом. Разве это не так?

2 голосов
/ 25 августа 2009

Одна вещь, которую вы можете попробовать для ввода с клавиатуры, - установить для свойства KeyPreview формы значение True. Это передаст все события клавиатуры сначала объекту Form, а не отдельным элементам управления. Создайте обработчик события для события KeyPress формы, и там вы можете установить для свойства Handled объекта KeyPressEventArgs значение True, чтобы предотвратить передачу нажатия клавиши любому из элементов управления. Если вы в настоящее время извлекаете данные из веб-службы, установите для свойства Handled значение True, в противном случае установите для него значение False, и нажатие клавиши будет передано элементам управления.

Если у кого-то есть хорошая идея о том, как обрабатывать ввод с помощью мыши, вы уже настроены.

0 голосов
/ 25 августа 2009

Я обычно создаю функции LockUI () и UnlockUI () в моей форме, которые переключают элементы управления и переворачивают локальное поле формы, которое действует как флаг, указывающий на длительный процесс. Этот подход работает очень хорошо, если вы используете шаблон команды.

Как упоминалось ранее, вы можете переключать ввод с клавиатуры, используя свойство KeyPreview формы (как предложено TLiebe).

Что касается ввода мышью, вы можете отключить активность мыши, перехватывая сообщения WinProc и перехватывая сообщения ввода мыши . Это в основном то, что делает KeyPreview.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...