Vla*_*eev 5 gdi palette directdraw
我们正在维护一个使用DirectDraw的全屏256色图形模式的旧视频游戏.问题是,在后台运行的某些应用程序有时会在游戏运行时尝试更改系统调色板,这会导致图形损坏.
我们可以(有时)通过处理WM_PALETTECHANGED消息来检测何时发生这种情况.在几个更新版本之前,我们添加了日志记录(只记录窗口标题/类/进程名称),这有助于用户识别有问题的应用程序并关闭它们.MSN Live Messenger是一个常见的罪魁祸首.
当我们发现Windows Vista(和7)"单独"完成它时,问题变得更糟.WM_PALETTECHANGED参数指向CSRSS和桌面窗口.在Vista中,经常使用的解决方法是打开任何文件夹(计算机,文档等)并在运行游戏时保持打开状态.听起来很荒谬,但在大多数情况下都有效.在Windows 7中,甚至这种解决方法都不再适用.用户发现停止某些服务(Windows Update和索引服务)也解决了某些配置上的问题.
前段时间我刚开始尝试随机的东西,希望能找到解决方案.我发现在设置DirectDraw调色板(使用IDirectDrawPalette :: SetEntries)之前设置GDI调色板(使用Create/SelectPalette)会在调色板损坏后恢复调色板(WM_PALETTECHANGED处理程序).SetSystemPaletteUse并在主表面上调用SetPalette帮助了更多.然而,当应用程序试图窃取调色板时,仍然可以感觉到闪烁,这在渐变期间尤其突出.
问题:有没有办法获得一个"真正的"独家调色板,只要我们的游戏保持关注,完全不允许其他应用程序更改Windows调色板?
实际上有人在这里找到了一个注册表项修复程序:
在该页面上查找“乱序颜色”,您将找到包含所需修复的部分。
不过,由于在线资源转瞬即逝,以下是完整的解释:
在“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw\Compatibility\”下为该程序创建一个新键。
如果您要应用兼容性的程序是 32 位程序,并且您使用的是 64 位系统(手动应用或通过 64 位程序应用),请不要忘记添加“Wow6432Node ”之间的“软件”和“DirectDraw”来弥补这一点。
在该键中,设置以下值:
要获取所需的 DirectDraw ID,请运行该程序,然后检查此注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw\MostRecentApplication
Run Code Online (Sandbox Code Playgroud)
同样,如果您使用的是 64 位系统,而您执行此操作的程序是 32 位系统,请在“软件”后面添加“Wow6432Node”。
该密钥中的 ID 是四个字节。颠倒它们的顺序以获得要放入 ID 值的字节。32dd83d5 变为 d5,83,dd,32。
| 归档时间: |
|
| 查看次数: |
3955 次 |
| 最近记录: |