Многие люди упускают тот факт, что у окон нет отдельного компонента диспетчера окон: - большинство обязанностей по управлению окнами выполняется каждым окном - обычно в DefWindowProc.
Большинство позиционирования и активации / деактивации окна осуществляется - в конечном итоге - посредством вызова SetWindowPos - который всегда отправляет сообщение WM_WINDOWPOSCHANGING, позволяющее окну окончательно сказать, что происходит.
DefWindowProc также активирует свое собственное окно в ответ на щелчки мыши и т. Д.
Результатом всего этого является то, что вполне возможно создать окна, которые никогда не принимают активацию - для этого требуется глубокое понимание того, какие сообщения и ситуации могли привести к активации.
В конечном счете, я могу сказать, что ОЧЕНЬ удобно иметь настройку отладки, настроенную для удаленной отладки, - чтобы вы могли взаимодействовать с отладчиком, не влияя на состояние активации системы, - и, следовательно, сбросить точку останова в окне в вопросах WM_ACTIVATE. обработчик и просто отладить любую ситуацию, приводящую к нежелательной активации.
Если вы также хотите обрабатывать фокус клавиатуры, это может быть сложнее - обычно фокус дается активированному окну - но опять же это обычно DefWindowProc, отвечающий за назначение обоих. Я просто вижу в этом опасность, когда одно окно все еще явно активировано, а другое - в фокусе. Это сильно запутает любое вспомогательное программное обеспечение.
Я бы испытал желание выполнить перехват сообщений на уровне цикла сообщений - аналогично IsDialogMessage - для фильтрации нажатий клавиш, предназначенных для всплывающего окна.