Настройка изменения поведения UIaccess ShowDialog

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

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

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

Здесь проблема: в этой версии UIaccess, когда пользователь вводит неверный пароль, диалоговое предупреждение о недопустимых учетных данных появляется за диалоговым окном входа. Тогда пользователь не может взаимодействовать с какой-либо частью приложения, потому что код все еще ожидает разрешения ShowDialog(), и из-за этого диалоговое окно входа в систему отключено.

Хотя мы смогли решить эту проблему, добавив проверку конструктору модального диалогового окна, которое выглядит так (в диалоговом окне входа всегда установлено значение Topmost=true, это условие гарантирует, что другие диалоговые окна одного типа не являются обязательно Topmost):

if (owner != null && owner.Topmost)
    Topmost = true;

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

Корень вопроса: почему атрибут UIAccess изменяет поведение ShowDialog() таким образом? Если оба диалога и модальное окно находятся в одном и том же потоке, почему их относительные позиции должны быть изменены, установив UIAccess для всего приложения?

Ответ 1

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