Тот факт, что многие люди пропустили, состоит в том, что у окон нет отдельного компонента оконного менеджера: - большинство обязанностей по управлению окнами выполняются каждым окном - обычно в DefWindowProc.
Большинство позиционирования и активации/деактивации окна выполняется - в конечном счете - посредством вызова SetWindowPos - который всегда отправляет сообщение WM_WINDOWPOSCHANGING, позволяющее окну иметь последнее слово о том, что происходит.
DefWindowProc также активирует собственное окно в ответ на щелчки мыши и так далее.
Результатом всего этого является то, что вполне возможно создать окна, которые никогда не принимают активацию, - это требует широкого понимания того, какие сообщения и ситуации могли привести к активации.
В конечном итоге я могу сказать, что очень удобно иметь настройку отладки, настроенную для удаленной отладки, - чтобы вы могли взаимодействовать с вашим отладчиком, не влияя на состояние активации системы, - и, следовательно, отбрасывать точку останова в окно в вопросах WM_ACTIVATE и просто отлаживать любую ситуацию, приводящую к нежелательной активации.
Если вы хотите справиться с клавиатурным фокусом, это может быть сложнее - обычно фокус присваивается активированному окну, но опять же его обычно DefWindowProc отвечает за назначение обоих. Я просто вижу, что это опасно, поскольку у меня есть одно окно, все еще очевидно активированное, а другое с фокусом. Это сильно смутит любое вспомогательное программное обеспечение.
У меня возникнет соблазн выполнить сообщение об ошибке уровня сообщения в контуре сообщения - Подобно IsDialogMessage - для фильтрации нажатий клавиш, предназначенных для всплывающего окна.
OSK.EXE (на экранной клавиатуре) делает это - хотя и глобально - вы могли бы совать со шпилем ++ –
Определенно, как эта идея. Однако, когда я его пробовал, кажется, что он просто активирует предыдущее окно (то есть: верхнее окно все еще теряет активацию). Я пытаюсь создать что-то, что чувствует себя как меню (но выглядит совершенно иначе), и даже мгновенная ошибка потери активации кажется неправильной. – Bob