Я работаю над приложением, которое оказывается начальной загрузкой для установщика, над которым я тоже работаю. Приложение выполняет несколько вызовов MSI, чтобы получить информацию, которая мне нужна для создания мастера, который является главным окном моего приложения, которое вызывает окно прогресса, которое открывается во время сбора информации, а затем исчезает, как только это будет сделано. Затем мастер настроен и запущен. Моя проблема в том, что мастер (производный от CPropertySheet) не хочет выходить на передний план и быть активным приложением, а я не добавляю в него некоторые вызовы.
Я решил проблему с выводом на первый план с помощью следующего кода в моем методе OnInitDialog ():
SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // force window to top
SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // lose the topmost status that the previous line gave us
Моя проблема в том, что я до сих пор не выяснил, как заставить окно самостоятельно активироваться (т.е. сделать себя тем, кто имеет фокус). SetFocus () не будет работать в этом контексте. Мне нужно что-то, что приведет окно к вершине Z-порядка и активирует его, желательно в минимально возможном количестве вызовов.
Я предполагаю, что окно прогресса, открываемое в начале вызовами MSI, приводит к тому, что главное окно испортилось, но у меня нет способа предотвратить появление этого окна. Кроме того, не имеет смысла скрывать это, потому что оно позволяет пользователю узнать, что происходит, прежде чем появится главное окно.