«Эксклюзивная» палитра DirectDraw на самом деле не является эксклюзивной

Мы поддерживаем старую видеоигру, которая использует полноэкранный 256-цветный графический режим с DirectDraw. Проблема в том, что некоторые приложения, работающие в фоновом режиме, иногда пытаются изменить системную палитру во время игры, что приводит к повреждению графики.

Мы можем (иногда) определить, когда это происходит, обработав сообщение WM_PALETTECHANGED. Несколько версий обновлений назад мы добавили ведение журнала (просто введите заголовок окна / класс / имя процесса), что помогло пользователям идентифицировать вредоносные приложения и закрыть их. MSN Live Messenger был распространенным преступником.

Проблема усугубилась, когда мы узнали, что Windows Vista (и 7) делает это «сама по себе». Параметры WM_PALETTECHANGED указывают на CSRSS и окно рабочего стола. В Vista часто применялся обходной путь - открыть любую папку (компьютер, документы и т. Д.) И оставить ее открытой во время игры. Звучит смешно, но это сработало - в большинстве случаев. В Windows 7 даже этот обходной путь больше не работал. Пользователи обнаружили, что остановка некоторых служб (Центра обновления Windows и службы индексирования) также решила проблему в некоторых конфигурациях.

Некоторое время назад я просто начал пробовать случайные вещи в надежде найти решение. Я обнаружил, что установка палитры GDI (с помощью Create / SelectPalette) перед настройкой палитры DirectDraw (с использованием IDirectDrawPalette :: SetEntries) восстановит палитру после ее повреждения (обработчик WM_PALETTECHANGED). SetSystemPaletteUse и вызов SetPalette на первичной поверхности помогли еще немного. Однако при попытке кражи палитры приложение все еще ощущает мерцание, которое особенно заметно во время затухания.

Вопрос: есть ли способ получить «настоящую» эксклюзивную палитру, которая полностью запрещает другим приложениям изменять палитру Windows, пока наша игра сохраняет фокус?

Ответы на вопрос(5)

Ваш ответ на вопрос