В Vista и более поздних версиях, если приложение перестает отвечать на запросы, диспетчер окон рабочего стола может обрабатывать его перерисовку, когда это необходимо (переместить окно поверх него, перетащить его и т. Д.), Поскольку для него сохранен пиксельный буфер. Windows также пытается определить, когда приложение перестает отвечать на запросы по истечении некоторого времени ожидания, и пытается извлечь максимальную пользу из ситуации - я считаю, что она затемняет окно, добавляет «Не отвечает» в строку заголовка и, возможно, некоторые другие эффекты.
Теперь у нас есть приложение со скинами, которое использует области окон и многослойные окна, и оно не очень хорошо справляется с этими эффектами. Мы разрабатывали на XP, но заметили странный эффект при тестировании на Vista. В некоторых моментах приложение может потратить несколько минут на некоторые вычисления или обратный вызов, и «если сообщение не было получено в течение 5 секунд, DWM объявляет окно зависшим» ( MSDN - Предотвращение зависаний в приложениях Windows ). Кажется, что когда это происходит, возникает странная графическая проблема: любые пиксели, которые будут на 100% прозрачными из-за областей окна, становятся черными, что фактически делает окно снова прямоугольным с черным фоном. Кажется, есть и другие аномалии, когда пиксели исходного окна немного смещены в некоторых дочерних диалогах.
Я работаю над уменьшением таких задержек (в идеале, Windows никогда не нужно будет вмешиваться, как это), и пытаюсь поддерживать отзывчивость, пока она занята, но я все же хотел бы выяснить, что заставляет ее так рендериться, поскольку я не могу гарантировать, что могу устранить все задержки.
По сути, я просто хотел бы знать, что делает Windows, когда это происходит, и как я могу заставить свое приложение правильно работать с ним. Приложения со скинами все еще должны работать в Vista и более поздних версиях, поэтому мне нужно выяснить, что я делаю, это нестандартно. Я даже не знаю точно, как искать информацию о том, как Windows теперь обрабатывает приложения, не отвечающие на запросы, так как мои поиски возвращают только людей, имеющих проблемы с приложениями, которые не отвечают, или очень элементарных объяснений того, что DWM делает с такими приложениями. Черт возьми, я даже не уверен на 100%, что ответственность за это несет DWM, но это кажется вероятным. Есть потенциальные потенциальные клиенты?
фотография проблемы; снимки экрана не отражают эффект (обратите внимание, что буфер белого диалога смещен - он смещен точно на расстояние, на которое он был смещен от основного (синего) окна):