Отправка команды на показ формы диалога из неактивной формы - PullRequest
1 голос
/ 08 февраля 2011

Я хочу отправить ключи в диалоговую форму показа из другой неактивной формы. См. Рисунок

enter image description here

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

1 Ответ

1 голос
/ 12 февраля 2011

То, что вы спрашиваете, по сути невозможно. Как только вы поймете, как работают модальные диалоги (формы, которые отображаются с использованием метода ShowDialog, являются модальными), вы поймете, почему. Модальный диалог используется, когда вы хотите заставить пользователя взаимодействовать только с этим диалогом. Он не позволяет им взаимодействовать с любыми другими окнами в вашем приложении, отключая эти окна. Они становятся невосприимчивыми к щелчкам мыши, не получают ввод с клавиатуры и не могут получить фокус. Windows подает звуковой сигнал и мигает в строке заголовка модального диалогового окна, когда вы пытаетесь, это неощутимый способ покачать головой и сказать «нет, нет, нет».

То, что здесь происходит, заключается в том, что когда вы отображаете форму «Депозиты» в виде модального диалога с использованием метода ShowDialog, все другие окна в вашем приложении отключаются. В вашем конкретном случае это означает, что окно, содержащее вашу экранную клавиатуру, также отключено и не может получать события щелчка мышью. Вот почему ничего не происходит, когда вы пытаетесь нажать на его «клавиши» (кнопки).

Самый простой обходной путь (как я предложил в комментарии) - показать форму «Депозиты» в виде не -модального диалога, используя вместо этого метод Show. В отличие от модального диалога, это не отключит другие окна в вашем приложении, позволяя пользователю взаимодействовать со всеми из них одновременно. Нажатие на другое окно установит фокус на это окно и позволит ему обрабатывать входные события. Но вы говорите, что это не работает для вас, потому что вы хотите, чтобы форма «Депозиты» отключала все элементы управления в главном окне, но не вашей экранной клавиатуре.

Конечно, я солгал в начале, когда сказал, что это "невозможно". Я имел в виду, что это очень сложно и потребует от вас работы со стандартной моделью интерактивности Windows. Пара идей
о том, как вы могли бы сделать эту весну на ум:

  1. Вы можете использовать утилиту экранной клавиатуры, которая входит в состав всех последних версий Windows. Microsoft уже предоставляет программу для этой цели. Вам не нужно создавать и поддерживать свою собственную, она уже включает в себя всю необходимую логику, чтобы предотвратить кражу фокуса, когда пользователь нажимает на одну из своих «клавиш», и поскольку она не является частью вашей программы, она не будет отключен, когда вы отображаете формы как модальные с использованием метода ShowDialog. Чтобы проверить это, перейдите в Пуск -> Выполнить и введите osk.

    Например, в Windows 7 это выглядит примерно так:

    On-Screen Keyboard in Windows 7

  2. Если вы настаиваете на использовании собственной, специально разработанной экранной клавиатуры, вам придется показывать ее как дочернее окно вашего модального диалога. То есть ваше приложение начинается с его основной формы, как обычно. Затем при отображении формы «Депозиты» в виде модального диалога с использованием метода ShowDialog основная форма отключается. Из формы «Депозиты» можно отобразить форму экранной клавиатуры, используя метод non -modal Show. Основная форма все еще отключена, потому что она показывает модальное диалоговое окно (форма «Депозиты»). Но форма «Депозиты» не отключена, потому что в ней отображается не -модальное диалоговое окно (ваша экранная клавиатура).

...