Итак, у меня есть приложение, поведение окна которого я хотел бы вести себя как Photoshop CS. В Photoshop CS окна документов всегда остаются за окнами инструментов, но остаются окнами верхнего уровня. Для дочерних окон MDI, поскольку окно документа на самом деле является дочерним, вы не можете переместить его за пределы основного окна. В CS, однако, вы можете перенести изображение на другой монитор, что является большим преимуществом по сравнению с пристыкованными приложениями, такими как Visual Studio, и над обычными MDI-приложениями.
В любом случае, вот мое исследование. Я попытался перехватить сообщение WM_MOUSEACTIVATE и использовать команды DeferWindowPos, чтобы выполнить собственный порядок окна, а затем вернуть MA_NOACTIVATEANDEAT, но это приводит к тому, что окно не активируется должным образом, и я считаю, что есть другие команды, которые "активируют" "окно без вызова WM_MOUSEACTIVATE (вроде SetFocus (), я думаю), так что этот метод, вероятно, не будет работать в любом случае.
Я полагаю, что процедура Windows для "активации" окна
1. уведомить неактивированное окно с сообщениями WM_NCACTIVATE и WM_ACTIVATE
2. переместить окно в верхнюю часть z-порядка (отправка сообщений WM_POSCHANGING, WM_POSCHANGED и перерисовка)
3. уведомить вновь активированное окно сообщениями WM_NCACTIVATE и WM_ACTIVATE.
Кажется, самый чистый способ сделать это - перехватить первое сообщение WM_ACTIVATE и как-то уведомить Windows, что вы собираетесь переопределить их способ выполнения z-упорядочения, а затем использовать команды DeferWindowPos, но я могу не понять, как это сделать таким образом. Кажется, что когда Windows отправляет сообщение WM_ACTIVATE, она уже собирается выполнить переупорядочение по-своему, поэтому любые команды DeferWindowPos, которые я использую, переопределяются.
Прямо сейчас у меня есть базовая реализация quasy -work, которая делает окна инструментов самыми верхними, когда приложение активировано, но затем делает их не самыми верхними, когда это не так, но это очень странно (иногда это происходит поверх других Windows, как диспетчер задач, в то время как Photoshop CS не делает этого, поэтому я думаю, что Photoshop каким-то образом делает это по-другому), и кажется, что есть более интуитивный способ сделать это.
В любом случае, кто-нибудь знает, как это делает Photoshop CS, или лучше, чем использование topmost?