Utrzymujemy starą grę wideo, która wykorzystuje tryb 256-kolorowy na pełnym ekranie z DirectDraw. Problem polega na tym, że niektóre aplikacje działające w tle czasami próbują zmienić paletę systemu podczas działania gry, co powoduje uszkodzenie grafiki."Ekskluzywna" paleta DirectDraw nie jest w rzeczywistości ekskluzywna.
Możemy (czasami) wykryć, kiedy tak się dzieje, przetwarzając komunikat WM_PALETTECHANGED. Kilka aktualizacji wersji temu dodaliśmy rejestrowanie (wystarczy, że zalogujesz się do tytułu/klasy okna/nazwy procesu), co pomogło użytkownikom zidentyfikować obraźliwe aplikacje i je zamknąć. MSN Live Messenger był częstym winowajcą.
Problem pogorszył się, gdy dowiedzieliśmy się, że Windows Vista (i 7) robi to "samodzielnie". Parametry WM_PALETTECHANGED wskazują na CSRSS i okno pulpitu. W systemie Vista rozwiązaniem, które często działało, było otwieranie dowolnego folderu (komputer, dokumenty itp.) I pozostawienie go otwartego podczas uruchamiania gry. Brzmi śmiesznie, ale zadziałało - w większości przypadków. W systemie Windows 7 to obejście już nie działa. Użytkownicy stwierdzili, że zatrzymanie niektórych usług (Windows Update i usługa indeksowania) również rozwiązało problem w niektórych konfiguracjach.
Jakiś czas temu zacząłem próbować przypadkowych rzeczy w nadziei na znalezienie rozwiązania. Zauważyłem, że ustawienie palety GDI (przy użyciu opcji Utwórz/WybórPaleta) przed ustawieniem palety DirectDraw (przy użyciu IDirectDrawPalette :: SetEntries) przywróci paletę po jej uszkodzeniu (WM_PALETTECHANGED handler). SetSystemPalette Zastosowanie i wywołanie SetPalette na powierzchni podstawowej pomogło nieco więcej. Jednak nadal widoczne jest migotanie, gdy aplikacja próbuje ukraść paletę, co jest szczególnie widoczne podczas zacieków.
Pytanie: czy istnieje sposób na uzyskanie "prawdziwej" ekskluzywnej palety, która całkowicie uniemożliwia innym aplikacjom zmianę palety Windows, o ile nasza gra zachowuje ostrość?
Dzięki, wysłaliśmy skrypt do testowania naszych użytkowników, zobaczmy jak będzie działać w naszej grze w praktyce. –
Tak, wydaje się działać :) Dzięki! –
To wygląda na kompatybilność, którą Microsoft umieścił w aplikacjach, które nie obsługiwały prawej palety. –