У меня есть приложение, в котором пользователям при входе в систему предлагается приглашение с модальным диалогом, где они должны выбрать объект, из которого они хотят работать. На этом этапе приложение выглядит следующим образом:
Модальный диалог показан путем вызова этого метода:
bool __fastcall ShowFacChoiceForm()
{
TFacChoiceForm *Form = new TFacChoiceForm( Application );
bool Result = ( Form->ShowModal() == mrOk );
delete Form;
return Result;
}
В этом случае TFacChoiceForm
наследует от TForm
поэтому ShowFacChoiceForm()
вызывает стандартный метод TForm.ShowModal
описанный здесь.
Проблема, с которой я сталкиваюсь, заключается в том, что если мое приложение теряет фокус, оно не может снова стать активным окном, если не щелкнуть сам модальный диалог. Чтобы лучше проиллюстрировать это, я приведу следующий сценарий:
Позвольте сказать, что в пятницу днем, и я решил немного уйти и прочитать некоторые веб-комиксы. Открыв мое приложение, я открою еще одно окно поверх него:
Затем из ниоткуда мой босс приходит на обзор производительности, и я пытаюсь переориентировать свое приложение, щелкнув где-то на главной форме. Например, в положении этого красного X на следующем изображении.
На приведенном выше изображении я щелкнул по краю X. Теперь и форма, содержащая веб-комикс, и мое приложение неактивны. Таким образом, мое приложение не появляется в передней части экрана.
Однако, если я могу щелкнуть где-нибудь в модальном диалоге, например, красный X на следующем изображении...
... тогда мое приложение выходит на фронт, как и следовало ожидать.
Чтобы решить эту проблему, я рассмотрел использование чего-то вроде SetForegroundWindow из Windows API, но мне не удалось найти способ инициировать событие, так как моя основная форма не запускает события, пока у меня модальный диалог открыт.
Мой вопрос заключается в том, как я могу убедиться, что если пользователь нажимает на мое приложение, то оно выводится на передний план? Есть ли свойство, которое я могу редактировать в своей форме, чтобы сделать это?
Если вы установите modalresult для mrcancel в ondeactivate модального диалога, тогда основная форма получит фокус при его нажатии. Затем вы можете проверить, зарегистрирован ли пользователь в событии mousedown основной формы, а если нет, снова покажите модальный диалог.