摘要
SetEntries failed 这一条 DirectDraw 报错表明 Diablo II 在全屏独占模式里试图把 256 色调色板写入显存时,Windows 11 拒绝了调用。现代显卡与 Windows 的 Fullscreen Optimizations、HDR、多显示器合成等机制会让 8‑bit 调色板接口形同虚设,于是 DirectDraw 返回 DDERR_GENERIC,游戏虽然还能画出启动画面,却收不到任何鼠标事件,于是你无法点击进入菜单。窗口模式 (-w) 可以工作,是因为 Windows 会把游戏当成一个普通 GDI 窗口用 32‑bit 真彩渲染,完全绕过调色板。解决思路大体有两条:① 让系统继续跑窗口 / 无边框模式;② 把过时的 DirectDraw 调用转换成现代 API(OpenGL、D3D 9、D3D 11 等)。下面给出可操作的方案。
根本原因解析
调色板失效导致 SetEntries 失败
SetEntries 专门负责把 256‑色调色板写进显存;一旦驱动或系统不再暴露硬件调色板,调用就会无条件返回 DDERR_GENERIC,在日志里正是你看到的那一行 (GitHub)。
Stack Overflow 上的老 DirectDraw 开发帖子提到,只要其独占调色板被别的软件或系统组件劫持,也会触发同样的错误 ([Stack Overflow](https://stackoverflow.com/questions/1054365/exclusive-directdraw-palette-isnt-actually-exclusive?utm_source=chatgpt.com ““Exclusive” DirectDraw palette isn’t actually exclusive - Stack Overflow”))。
Windows 11/10 的官方论坛明确指出,现代显卡本身已经不支持 256‑色模式,系统只能用兼容层去模拟 (Microsoft Learn)。在全屏独占模式下,这层模拟往往被绕开,从而留下隐患。
全屏独占 + Fullscreen Optimizations 的副作用
Fullscreen Optimizations 把传统的独占全屏偷偷换成了伪全屏(borderless window),再配合 DWM 统一合成。如果游戏硬编码使用旧版 DirectDraw 接口,DWM 与驱动之间的颜色路径就会断链,结果就是 SetEntries 报错,鼠标输入也跟着失效 (Windows 11 Forum)。
为什么窗口模式能正常
窗口模式下,Diablo II 在 32‑bit GDI 表面上跑,调色板完全由系统自己管理,不触及 SetEntries,因此不存在上述冲突。
解决方案
1. 继续使用窗口模式或 Borderless Window
如果你并不强求“真”全屏,最简单的办法就是保留 -w 参数,然后:
右键快捷方式 → 属性 → 兼容性,勾选 禁用全屏优化 (Windows 11 Forum);
在 高 DPI 设置 里把缩放交给 应用 管理,避免模糊;
如需等比例放大,可在桌面分辨率里把缩放设为 125% 或 150%。
2. 给 DirectDraw 上“假体”——cnc‑ddraw 或 ddwrapper
cnc‑ddraw 是一个开源的 ddraw.dll 替换件,会把所有 DirectDraw 调用转译成 OpenGL / D3D9,可选窗口、Borderless 或真正的全屏独占,而且自带 FPS Limiter、VSync、Alt+Enter 切换等现代特性 (ModDB, GitHub)。
步骤
下载最新压缩包并解压到 Diablo II 根目录(与 Game.exe 同级)。
双击 cnc-ddraw config.exe,渲染器选 Auto 或 OpenGL,勾选 Borderless 与 Maintain Aspect Ratio。
确认游戏启动命令里不再带 -w,直接运行即可。
⚠️ 如装了国产安全软件,检查注册表 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls,确认没有多余的 ddraw.dll,否则系统会绕过文件夹里的替换件 (GitHub)。
3. 用 Glide Wrapper / D2DX 走 -3dfx 路线
Diablo II 自带对 3Dfx Glide 的支持,只是 2025 年的显卡早已不认 Glide,这就需要“翻译官”。
Sven's Glide Wrapper(GLIDE3‑to‑OpenGL)体积小、配置简单 (GeekwithEnvy);
新世代的 D2DX 基于 D3D 11,默认支持高分辨率与可变刷新 (Reddit)。
使用方法
把 glide3x.dll 复制到游戏目录;
执行 D2VidTst.exe,选择 Glide;
启动时去掉 -w,改加 -3dfx 可显式指定 Glide;
在 glide-init.exe 里勾选 Capture Mouse 与 Desktop Resolution.
此方案完全绕开 DirectDraw,自然也就不会再触碰 SetEntries。
4. 传统兼容性选项(应急方案)
当你不方便用 DLL 替换时,可尝试以下组合——这些方法未必 100% 成功,但有时足够把游戏“救活”一次:
选项解释设置路径兼容模式把 API 调用模拟成旧版 Windows属性 → 兼容性 → Windows XP SP2/3 (GeekwithEnvy)16‑bit 色避免游戏调用 8‑bit 调色板同上,勾 简化颜色模式 → 16‑bit (GeekwithEnvy)禁用 Fullscreen Optimizations让游戏获得真正的独占全屏同上,勾选 禁用全屏优化 ([Windows 11 Forum](https://www.elevenforum.com/t/enable-or-disable-fullscreen-optimizations-for-games-in-windows-11.4945/ "Enable or Disable Fullscreen Optimizations for Games in Windows 11启用 DirectPlayDirectDraw 旧组件依赖添加 Windows 功能 → 旧版组件 → DirectPlay (MiniTool)
如果以上操作后仍提示 Missing ddraw.dll,说明系统路径下没有旧版 DirectDraw,你可以把 ddraw.dll 从 cnc‑ddraw 或 ddwrapper 拷贝过去,但更推荐放在游戏目录,并配合 NoDRM 补丁。
5. 其他注意事项
关闭所有覆盖型软件(Xbox Game Bar、Discord Overlay、GeForce Experience 等),它们会抢夺 DWM 管线,导致调色板再次失效。
如使用多显示器,请试着在 Windows 设置里把主显示器切到你想全屏的那块,再启动游戏;或者物理断开其它显示器后再插回。
更新显卡驱动,有时新版驱动在窗口化兼容层里会修复 8‑bit 调色板,但旧版不会。
小结
问题本质是“老游戏用 8‑bit 调色板 + 新系统取消硬件调色板”,在全屏独占时直接导致 SetEntries 失败,从而屏蔽鼠标输入。通过 窗口 / 无边框模式 或 DirectDraw / Glide 兼容层 把渲染工作交给现代 API,即可彻底规避。推荐优先尝试 cnc‑ddraw,因为它一步到位地解决了画面、输入、分辨率与 Alt+Tab 等系列兼容问题;如需更高分辨率或特效,再考虑 D2DX。至于传统的兼容性标志,只在无法替换 DLL 的极端场景下备用即可。祝你重返庇护之地,畅通无阻。