我们正在维护一个使用 DirectDraw 的全屏 256 色图形模式的旧视频游戏。问题是,某些在后台运行的应用程序有时会在游戏运行时尝试更改系统调色板,从而导致图形损坏。
我们可以(有时)通过处理 WM_PALETTECHANGED 消息来检测何时发生这种情况。几个更新版本之前,我们添加了日志记录(只记录窗口标题/类/进程名称),这有助于用户识别有问题的应用程序并关闭它们。MSN Live Messenger 是一个常见的罪魁祸首。
当我们发现 Windows Vista(和 7)“自行”完成时,问题变得更糟了。WM_PALETTECHANGED 参数指向 CSRSS 和桌面窗口。在 Vista 中,一种常用的解决方法是打开任何文件夹(计算机、文档等)并在运行游戏时将其保持打开状态。听起来很荒谬,但它确实有效——在大多数情况下。在 Windows 7 中,即使是这种解决方法也不再有效。用户发现停止某些服务(Windows 更新和索引服务)也解决了某些配置上的问题。
前段时间我刚开始尝试随机的东西,希望能找到解决方案。我发现在设置 DirectDraw 调色板(使用 IDirectDrawPalette::SetEntries)之前设置 GDI 调色板(使用 Create/SelectPalette)会在调色板损坏后恢复它(WM_PALETTECHANGED 处理程序)。SetSystemPaletteUse 和在主表面上调用 SetPalette 提供了更多帮助。然而,当应用程序试图窃取调色板时,仍然存在可察觉的闪烁,这在淡入淡出期间尤为突出。
问题:有没有办法获得一个“真正的”专有调色板,只要我们的游戏保持焦点,就完全不允许其他应用程序更改 Windows 调色板?