Не удается сфокусироваться в главном окне после закрытия диалогового окна из другого потока

Я создаю новый CWindThread в CWinApp::InitInstance(). В этом потоке я создаю диалог (для отображения индикатора выполнения в этом диалоге).

После завершения InitInstance() я закрываю диалоговое окно, вызывая DestroyWindow() из диалогового окна, но приложение теряет фокус из главного окна.

Я использовал AfxGetMainWnd()->SetActiveWindow();, чтобы установить фокус для главного окна, но это не работает.

Как вернуть фокус в главное окно после закрытия диалога?


person KidNg    schedule 26.04.2016    source источник
comment
Вы пробовали функцию SetFocus()? msdn.microsoft.com/en-us/library/ms646312 (VS.85).aspx   -  person A.Fagrell    schedule 26.04.2016
comment
Я использовал pMainFrame->SetFocus(), но это не работает   -  person KidNg    schedule 26.04.2016
comment
Ваша реализация обратная: разгрузите работу в рабочий поток и уведомите оттуда свой поток графического интерфейса. Иерархии окон с перекрестными потоками очень трудно поддерживать.   -  person IInspectable    schedule 26.04.2016
comment
Мое временное решение - попытаться закрыть диалоговое окно перед вызовом основного потока, чтобы открыть главное окно (основной фрейм). Это сработало, но я думаю, что это не лучшее решение.   -  person KidNg    schedule 26.04.2016


Ответы (2)


Нет действительно хорошего способа сделать это. Фокус устанавливается для каждого потока. Таким образом, нет «фокуса» на всех окнах.

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

Если это не сработает, вам нужно "синхронизировать" обе очереди сообщений. Это делается с помощью AttachThreadInput. Если обе очереди сообщений уже подключены, то нет проблем с настройкой фокуса напрямую. Но поведение приложения изменится... Пожалуйста, прочтите документы функций, которые я также связал.

person xMRi    schedule 26.04.2016
comment
Проблема сложная, потому что некоторые состояния системы всегда относятся к потоку, а не ко всей системе. Фокус это такая штука, как активное окно и прочие. Просто дайте SetForegroundWIndow шанс вместо SetFocus... это может быть быстрым решением. - person xMRi; 26.04.2016
comment
AttachThreadInput в этом сценарии нельзя использовать. Как только вы устанавливаете связь родитель/владелец между потоками, система неявно прикрепляет входные очереди участвующих потоков. - person IInspectable; 26.04.2016
comment
Это сложно только потому, что ваше решение неверно - person David Heffernan; 26.04.2016

Когда отображается модальное всплывающее окно, причина, по которой пользователь не может взаимодействовать с окном-владельцем, заключается в том, что оно отключено. Когда модальное окно уничтожено, необходимо позаботиться о повторном включении окна владельца ПЕРЕД уничтожением всплывающего окна, поскольку окна не могут активировать отключенное окно. Это обычная причина того, что всплывающие окна повторно активируют не то окно.

person Chris Becke    schedule 26.04.2016
comment
Модальность реализуется с использованием отношений владелец/владелец, а не отношений дочерний/родительский. - person IInspectable; 26.04.2016