我有一个旧的 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 32bit”中运行此程序,并且显示适配器当前为“Microsoft Hyper-V Video”。尝试将其更改为“Microsoft Basic Display Adapter”,但这没有帮助。
编辑2:在某处读到 Win10 创作者更新破坏了 GDI 应用程序,因此使用较早版本的 Windows (1607) 进行了测试。因此问题实际上变为“如何让 GDI 应用程序在创作者更新后正确运行”。
答案1
我没有找到解决布局问题的方法,但幸运的是能够解决它。
在研究期间的某个时候,我发现人们在 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 Enterprise 2016 LTSB 版进行了测试,该版本已将支持延长至 2026 年 - 应用程序运行正常!
案件暂时结案。