Я работаю над приложением, которое является начальной загрузкой для установщика, над которым я также работаю. Приложение делает несколько вызовов 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, вызывает сбои в главном окне, но у меня нет способа предотвратить появление этого окна. Кроме того, не имеет смысла скрывать его, потому что он позволяет пользователю узнать, что происходит, до появления главного окна.