Работя върху приложение, което случайно е началната програма за инсталатор, върху който също работя. Приложението прави няколко 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 извикванията, причинява прецакване на главния прозорец, но нямам начин да попреча на този прозорец да се появи. Освен това не би имало смисъл да го скривате, защото позволява на потребителя да разбере какво се случва, преди да пристигне основният прозорец.