我有一个旧的 C Win16 应用程序,在 Windows 10 32 位中运行时表现不佳。不幸的是,我没有应用程序的源代码,所以我无法从那里调试问题。该应用程序在 Windows 7 中正常运行,但在 Windows 10 中,它通过使用 NTVDM 启动,但由于某种原因,GUI 存在以下问题:
问题 1. 应用程序在启动时打开一个弹出对话框。鼠标交互有效,因此我可以在应用程序窗口周围拖动弹出对话框,但弹出窗口本身没有焦点,我无法单击任何按钮或向对话框输入文本。当弹出窗口打开时,我仍然可以使用 Alt+F 访问顶部应用程序栏中的文件菜单。
问题 2. 应用程序也可以配置为在没有弹出窗口的情况下打开。在这种情况下,顶部菜单栏和状态栏显示不当,并且不响应键盘的任何输入。
在这两种情况下,单击主应用程序窗口按钮都没有任何作用,我需要使用任务管理器来终止 ntvdm.exe 以关闭应用程序。
到目前为止,我已经尝试了不同的兼容模式设置以及尝试使用替代 VDM (WineVDM) 运行应用程序。兼容模式不执行任何操作,应用程序使用 WineVDM 启动,但具有与使用 NTVDM 相同的布局问题。这似乎表明问题不在 VDM 中,而更多地与 Win7 和 Win10 之间的遗留图形渲染差异有关。
接下来我应该尝试什么?有没有办法确定使用了哪个 GUI 框架?
编辑:我目前正在 64 位 Windows 10 机器内的虚拟机“Win10 32 位”中运行它,显示适配器目前是“Microsoft Hyper-V Video”。尝试将其更改为“Microsoft Basic Display Adapter”,但这没有帮助。
Edit2:在某个地方读到 Win10 创作者更新破坏了 GDI 应用程序,因此使用较早版本的 Windows (1607) 进行了测试。所以问题实际上变成了“我怎样才能让 GDI 应用程序在 creators 更新后正确运行”。
我没有找到解决布局问题的方法,但幸运的是能够解决它。
在研究期间的某个时候,我发现人们在 2017 Windows 10 Creators Update(版本 1703)之后遇到了 GDI 渲染应用程序的问题。字体渲染性能在某些方面受到影响,人们也有其他问题。进一步的研究表明,在 1703 版本中,微软对控制应用程序如何绘制到屏幕的桌面窗口管理器 (DWM) 进行了一些重大更改。使用 DWM,应用程序将它们的内容绘制到每个应用程序的单独内存缓冲区中,例如用于在现代 Windows 应用程序中显示实时工具栏缩略图。旧的方法是让应用程序直接绘制到屏幕缓冲区中。更新 1703 使得无法为任何应用程序禁用 DWM,并弃用了用于为每个应用程序单独控制它的 API 部分。
我使用 Windows 10 周年更新(版本 1607)测试了有问题的应用程序,它成功了!令人毛骨悚然的布局问题消失了,应用程序运行起来非常棒。当然,问题在于 Windows 10 1607 版的支持窗口甚至比最新版本的 Windows 7 更短。幸运的是,微软为其 Windows 企业版提供了使用长期支持分支的选项,这些分支反映了“正常”于同年发布。我使用 Windows 10 企业版 2016 LTSB 版本进行了测试,该版本已将支持延长至 2026 年 – 该应用程序运行良好!
案件暂时结案。