Мне было любопытно, как работают выпадающие списки и меню, поэтому я провел еще несколько исследований.
Существует два основных подхода.
Создать всплывающее окно как перекрывающееся окно, которым владеет главное окно
Этот метод требуется, если во всплывающем окне есть встроенные элементы управления или если вы хотите, чтобы всплывающее окно велось как немодальное диалоговое окно.
Если пользователь собирается взаимодействовать с дочерними элементами управления во всплывающем окне, он должен получить активацию. (Таким образом, различные методы блокирования активации, такие как обработка WM_MOUSEACTIVATE, являются «красными сельдями».) И когда он получает активацию, Windows деактивирует главное окно. Исправление для этого состоит в том, чтобы отправить сообщение WM_NCACTIVATE родителю, чтобы обновить его внешний вид без изменения статуса активации. Этот подход используется в .Net ToolStrip, и мой другой ответ иллюстрирует его с помощью кода.
Создать всплывающее окно как дочернее окно рабочего стола
Этот метод используется выпадающими списками в выпадающих списках и (я полагаю) меню, но вы не можете встроить дочерние элементы управления, поэтому он не имеет широкого применения.
Всплывающее окно является дочерним окном, поэтому оно не мешает активации. Это всегда на высоте. Захват мыши используется для обнаружения кликов за пределами всплывающего окна и отклонения его.
Однако это не так просто реализовать. Активация остается за основным приложением, поэтому она сохраняет фокус и получает нажатия клавиш. Кажется, это исключает встроенные элементы управления во всплывающем окне, поскольку они не могут получить фокус. Комбо-бокс обрабатывает это, перенаправляя сообщения нажатия клавиш в выпадающий список. (Обратите внимание, что меню, выпадающие списки и т.д. все полностью нарисованы владельцем в том смысле, что у них нет встроенных окон.)