题
我们维持旧的视频游戏,使用一个全屏256-颜色的图形方式与启.问题是,某些应用程序运行的背景,有时试图改变系统的调色板游戏时运行,其结果在损坏的图形。
我们可以(有时)检测,当发生这种情况通过处理WM_PALETTECHANGED消息。一些更新的版本之前,我们加入日志记录(只要登录窗口标题/class/工艺的名称),它帮助用户确定违规的应用和关闭它们。MSN Live Messenger是一个共同的罪魁祸首。
问题变得更糟,当我们发现,Windows Vista(7)它"本身"。WM_PALETTECHANGED参数指向CSRSS和桌面上的窗口。在Vista,一个解决办法,这常常是以开放的任何文件夹(计算机、文件等)。 并把它打开,同时运行的游戏。听起来很荒谬,但它的工作-在大多数情况下。在Windows7,甚至没有这种解决方法的工作。用户发现,停止一些服务(Windows更新和索引服务)还解决了这个问题上的一些配置。
前些时我就开始随机的事情中,希望找到一个解决方案。我找到那设置GDI调色板(使用创建/SelectPalette)在设置之前启palette(使用IDirectDrawPalette::SetEntries)将恢复调色板后成为破坏(WM_PALETTECHANGED handler)。SetSystemPaletteUse并呼吁SetPalette在主面帮助更多一些。但是,仍然有可感知的闪烁的,当应用程序试图偷的调色板,这是特别突期间消失。
问题:有没有办法获得"真正的"独有的调色板,这完全不允许其他应用程序更换窗户的调色板只要我们的游戏保留了重点?
解决方案
有人实际上发现了一个登记册条目的修复这一点,在这里:
寻找"扰的色彩"在该网页上,你会得到一部分的修你需要的。
由于在线资源是短暂的,但是,这是充分说明:
做一个新的关键在"此\软件\微软\启\兼容性\"的程序。
如果该程序申请的兼容性是一个32位的程序,和你在一64位系统(不管是用手动或通过一个有64位计划)时,不要忘记添加"Wow6432Node"之间的"软件"和"启"补偿。
在这关键,设置这些价值观:
- "标志"(REG_BINARY):[00,08,00,00]
- "姓名"(REG_SW):文件名称的程序。没有路径,只是可执行的文件名称。
- "ID"(REG_BINARY):启ID的应用程序。
来获得所需的启ID,运行程序,然后检查登记册的关键:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw\MostRecentApplication
再次,如果你在64位系统和节目你在做这个是32位之一,添加"Wow6432Node"之后的"软件"。
ID在,关键的是四个字节。反他们为了得到字节把在ID值。32dd83d5变d5、83、dd,32.
其他提示
你可以做些什么是一个"简单"的解决方法。因为你的游戏是一个古老的游戏中它可能是没有匹配的以前的硬件,这就是为什么这一招会的工作:
- 位图传送的一切到屏幕外的缓冲区(存储器)
- 转换8bit缓冲区的16位(或32bit)利用目前的调色板 (因此也做了在存储器)
- 复制的内容的16位(32位或)缓冲区的backbuffer的屏幕上
- 翻转screenbuffer.
这将需要很少的改变你的游戏,并将摆脱色问题完全,但你的游戏仍然可以使用它所有的调色板诡计
R
显然“的应用程序不应该调用SetSystemPaletteUse,除非它有一个最大化的窗口中输入焦点“。也许一些其他程序行为不正常。这说明使它听起来很像微软希望所有程序将进行合作并提供任何办法强迫他们这样做。这就像回到Windows 3.1上。 :)
随机建议:你试过SetSystemPaletteUse与SYSPAL_NOSTATIC256参数
?您也可以看到,如果你的调色板包含20个窗口保留颜色;如果是的话,这意味着,仅仅使用Windows的颜色任何其他palettised程序不会需要改变调色板,以使本身,我理解这一点。
我不知道的DirectX所有,但我建议尝试做你的渲染关闭屏幕,然后转换成显示深度...我想你能得到的Direct2D做一切你...
所有你需要做的就是将PC设置到16 bit
控制面板中的颜色和游戏自带的权利,适用于Original Command and Conquer
对我来说:d