A paleta “Exclusive” do DirectDraw não é exclusiva

Estamos mantendo um videogame antigo que usa um modo gráfico de 256 cores de tela inteira com o DirectDraw. O problema é que alguns aplicativos executados em segundo plano às vezes tentam alterar a paleta do sistema enquanto o jogo está em execução, o que resulta em gráficos corrompidos.

Podemos (às vezes) detectar quando isso acontece processando a mensagem WM_PALETTECHANGED. Algumas versões atualizadas adicionamos o registro (apenas registre o título da janela / nome da classe / processo), o que ajudou os usuários a identificar aplicativos ofensivos e fechá-los. O MSN Live Messenger foi um culpado comum.

O problema piorou quando descobrimos que o Windows Vista (e 7) o faz "sozinho". Os parâmetros WM_PALETTECHANGED apontam para o CSRSS e a janela da área de trabalho. No Vista, uma solução que muitas vezes funcionava era abrir qualquer pasta (Computador, Documentos, etc.) e deixá-la aberta durante a execução do jogo. Parece ridículo, mas funcionou - na maioria dos casos. No Windows 7, nem mesmo essa solução funcionava mais. Os usuários descobriram que interromper alguns serviços (o Windows Update e o serviço de indexação) também resolveu o problema em algumas configurações.

Algum tempo atrás eu comecei a tentar coisas aleatórias na esperança de encontrar uma solução. Descobri que a configuração da paleta GDI (usando Create / SelectPalette) antes de definir a paleta do DirectDraw (usando IDirectDrawPalette :: SetEntries) restauraria a paleta depois que ela se tornasse corrompida (manipulador WM_PALETTECHANGED). SetSystemPaletteUse e chamando SetPalette na superfície primária ajudou um pouco mais. No entanto, ainda é possível perceber a oscilação quando um aplicativo tenta roubar a paleta, o que é especialmente proeminente durante os desvios.

Pergunta: Existe uma maneira de obter uma paleta exclusiva "real", que não permite que outros aplicativos alterem a paleta do Windows, contanto que o nosso jogo mantenha o foco?

questionAnswers(5)

yourAnswerToTheQuestion