Цветовой ключ окна WS_EX_LAYERED (LWA_COLORKEY) не работает в Windows 7 с включенным Aero Glass
Я пытаюсь сделать приложение DirectX8 (Game Maker) цветным ключом с использованием многоуровневых окон (флаги расширенного стиля WS_EX_LAYERED и метод LWA_COLORKEY) для прозрачности и правильного тестирования попадания в окно без полей. Однако из всех платформ, на которых я тестировал его, Windows 7 дает сбой, но только при включенном Aero Glass. Эффект работает, по-видимому, один кадр, а затем перестает работать - затем на экран выходит хромакей, а окно представляет собой полный прямоугольник, включая проверку нажатия мыши. Отключение Aero Glass в расширенном виде или переход на тему Basic или Classic решает проблему, но это нежелательно.
__declspec(dllexport) double __cdecl __gm82core_setchromakey(double enable, double color) {
if (enable>=0.5) {
SetWindowLong(window_handle,GWL_EXSTYLE,GetWindowLong(window_handle,GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes(window_handle,((DWORD)color)&0x00ffffff,0xff,LWA_COLORKEY);
} else {
SetWindowLong(window_handle,GWL_EXSTYLE,GetWindowLong(window_handle,GWL_EXSTYLE) & ~WS_EX_LAYERED);
}
return 0;
}
сломанный эффект в Win7 с включенным Aero Glass
(Все типы переменных являются двойными, потому что платформа разработки (Game Maker) позволяет передавать двойные числа только в собственный код)
- Я читал, что существуют проблемы с использованием цветов, которые имеют одинаковое значение на нескольких каналах, таких как белый или желтый для хроматического ключа, и пытался использовать такие цвета, как rgb (253254255) или (201202203), чтобы получить аналогичные результаты.
- Я читал, что цветовая рирпроекция, по-видимому, не работает в Windows 7 RC1, и мы можем просто предположить, что это не было исправлено для RTM из-за проблемного поведения.
- Я читал, что в Win 7 и более ранних версиях дочерние окна не могут иметь цветную клавиатуру, и я попытался удалить родителя окна с помощью SetParent(), чтобы получить аналогичные результаты (и внося другие проблемы в процесс), несмотря на родительский элемент окна. быть отключенным и невидимым, когда приложение запускается в режиме без полей.
- Эффект работает нормально, пока окно не будет обновлено, и больше никогда, что является проблемой, поскольку программа имеет анимированные элементы управления.
- Было проверено, что он работает в различных версиях Win 10, датированных еще 1903 годом:эффект работает, как предполагалось, в Win10.
- Я использовал альтернативный метод, используя прямую композицию DWM с использованием 32-битного формата поверхности ARGB, который обеспечивает попиксельную альфа-прозрачность на всех платформах, однако не позволяет тестировать нажатие мыши, что нежелательно для этого приложения из-за его бесплатности. окно формы.
- Несмотря на то, что эффект работает правильно в Win10, я хотел бы также поддерживать Win7, поскольку это общая цель для пакета расширения, из которого взят этот код.