Простая причина GetClipBox() не возвращает NULLREGION с DWM включен, потому что вы не обрезаны! Вся точка DWM - это каждое окно (это не дочерний элемент, например кнопки или поля редактирования) получает собственный буфер для рисования, поэтому окна переднего плана можно перемещать, не заполняя окна позади них.
В качестве простого примера наведите указатель мыши на запись в окне панели задач, когда она находится в фоновом режиме, и посмотрите, как она обновляется в предварительном просмотре.
Также обратите внимание, что со стеклянными краями ваше окно может быть полностью закрыто другими окнами и должно быть видно! (Вы даже не можете тестировать клиентскую область из-за расширенного стекла, как использует проигрыватель Windows Media, - измените его размер настолько, насколько это будет возможно, и увидите, что он использует стекло для всей его области!) Конечно, слоистые окна (от XP on) и пользовательские области окна означали, что это всегда может быть так, но теперь это значение по умолчанию.
Резюме/TL; DR:
Если вы делаете тяжелые анимации/модные эффекты и хотите, чтобы уменьшить нагрузку на процессор при работе под DWM, вероятно, лучшее, что вы можете сделать, это определить, когда приложение теряет передний план и откажитесь от большего количества обновлений, совместимых с ЦП (НЕ обновляйте! Если вы получаете WM_PAINT и игнорируете его, потому что вы находитесь в фоновом режиме, вы не получите его, когда будете активированы!).
Спасибо за подробное объяснение! Как вы уже догадались, мое приложение выполняет интенсивные анимации процессора, поэтому я стараюсь уменьшить использование ЦП, когда мое окно не видно. Проверка того, что мое приложение является передним окном, похоже на разумную работу, я попробую. – flashk 2008-11-22 19:17:42