Модальный диалог не получает фокус - PullRequest
0 голосов
/ 28 марта 2012

Я имею дело с ошибкой, связанной с приложением C # WinForms, которое запускается с заставкой, затем закрывает заставку и открывает форму входа.На некоторых компьютерах все работает нормально.На других появляется форма входа, но с мигающей строкой заголовка, которая после нескольких миганий теряет фокус.Курсор все еще мигает в текстовом поле «Имя пользователя», но приложение не имеет фокуса, и когда вы начинаете печатать, ничего не происходит, что очень раздражает пользователя.

Кажется, что нетРазница в том, какая ОС работает (мы пробовали Windows 7 и Server 2008), и мы особенно старались не вводить ввод с клавиатуры или мыши после запуска приложения.

Теперь - кто-нибудь знает, чтоможет привести к потере фокуса в приложении?
Как бы вы решили эту проблему?Нам не удалось воспроизвести проблему в среде отладки Visual Studio, но это меня не совсем удивляет, так как я предполагаю, что это проблема взаимодействия скомпилированного приложения с ОС ... или я ошибаюсь?

РЕДАКТИРОВАТЬ # 1: Я думал, что это было решено @vinodpthmn, гарантируя, что заставка должным образом закрыта, прежде чем появится форма входа, но это, похоже, не помогло.Поэтому я создал регистратор для отслеживания всех событий и потоков и нашел следующие интересные записи журнала:

Thread 01 - 2012/03/29 12:51:09.693 - Show splash screen
Thread 01 - 2012/03/29 12:51:20.350 - Splash screen closed
Thread 01 - 2012/03/29 12:51:20.490 - Login Form Activated
Thread 01 - 2012/03/29 12:51:20.522 - Login Form Load
Thread 01 - 2012/03/29 12:51:25.694 - Login Form deactivated
Thread 01 - 2012/03/29 12:51:25.694 - Active form =
Thread 01 - 2012/03/29 12:51:25.694 - Active app =

В последних строках, отображающих активную форму и приложение, соответственно отображаются Form.ActiveForm и текущее активное приложение вWindows (код для этого здесь ).И они оба пустые / нулевые.Это так, даже если в форме входа в систему Load я звоню Activate() или SetForegroundWindow(), как предложено @memetolsen.Форма входа никогда не получает фокуса!

Есть идеи?

РЕДАКТИРОВАТЬ # 2: Ну, я просто удалила заставку, и теперь форма входа получает фокус.Замена заставки вновь приводит к ошибке.Но я ввел код, чтобы убедиться, что заставка расположена - не просто закрыта - прежде чем я попытаюсь открыть форму входа.

Может ли быть разница, что заставкаоткрывается с Application.Run(frmSplash)?

Ответы [ 4 ]

5 голосов
/ 01 апреля 2012

Может ли иметь значение, что заставка открывается с помощью Application.Run (frmSplash)

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

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

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

2 голосов
/ 28 марта 2012

Ранее я сталкивался с подобной проблемой, проблема была связана с неправильным закрытием заставки. Я подозреваю, что фокус может быть на этой форме (хотя не уверен).

  1. убедитесь, что вы выгружаете / закрываете форму заставки
  2. Экран входа в систему отображается после правильной выгрузки заставки
  3. Форма входа отображается как модальная для указания указателю выполнения дождаться следующего взаимодействия с пользователем
1 голос
/ 28 марта 2012

Может быть, это было бы решением, если бы вы указали следующее:

this.Activate();

или это:

SetForegroundWindow(this.Handle.ToInt32());

в событии загрузки формы.

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

1 голос
/ 28 марта 2012

Я предлагаю вам настроить удаленную отладку .Это позволит вам отлаживать приложение удаленно с компьютера разработчика.

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