编程工具,为什么微软

很快,负责此项目的 Windows
开发团队成员(@miniksa)对 Nick
的疑问进行了解答。

控制台的主要目的是对已有控制台应用保持向后兼容性。

WSL 的默认终端不像 Electron
等框架那样涉及到许多其他的层或框架,它有一个并不特别的裸窗口,并且没有任何附加组件。他们会从窗口消息(window
messages)而不是某种事件框架((WPF, WinForms, UWP,
Electron))来处理键入的内容,而这些内容是通过内核传输过来的。接着,他们使用
GDI 的 PolyTextOut 将文本直接转储到窗口而不带多余的装饰。

源码构建

一名开发者(下用 Nick 代称)在 Windows Terminal 的 GitHub repo
中发表了一个不是反馈问题的兴發国际娱乐手机登录, issue ——
他只是好奇该终端拥有这种如此顺滑输入的效果是如何实现的。

nuget restore OpenConsole.sln
msbuild OpenConsole.sln

Nick 觉得这种顺滑感是其他 Windows
应用都不具备的,甚至是最轻量的 notepad.exe 都未能提供这种输入体验。他还问到,这种 UI
增强功能将来是否会应用于所有 Windows 应用程序。

构建一个全新终端

miniksa 表示,保持在 WSL
默认终端输入内容的速度比其他应用快,这实际上就是他们唯一的工作!除此之外,也可能是因为他们必须使用
Windows 最旧和最低级别的 API 来完成此项工作。

我们还在 tools
目录下提供了一组常用的脚本可以帮助自动化处理构建和运行测试的过程。

(文/开源中国)    

  • Windows Terminal
  • Windows 控制台主机 (conhost.exe)
  • 上述两项目的共享组件
  • ColorTool
  • 示例项目 将展示如何使用 Windows Console APIs

兴發国际娱乐手机登录 1

诸多限制让我们决定开发一个全新的 Windows Terminal。

miniksa 解释道,notepad.exe
确实很轻量,不过在其窗口上也具有多个控件,并且可能在编辑控件中使用某种库、框架来确定其文本布局(也可能正在使用其他库或框架进行国际化支持…),这些都使得它们的输入速度比不上
WSL 默认终端。当然,WSL
也需要进行权衡取舍,它不像其他应用那样提供完全的国际化支持。

Windows 控制台主机

为什么要这样做?第一,conhost.exe
已十分陈旧。它必须使用所有内容的裸机底层,因为它是在创建其他大多数框架之前创建的。第二,它需要保持尽可能底层的级别,而且它是用
C/C++ 编写的,它需要尽可能保持底层的状态以方便提供给第三方使用。

该项目使用 git submodules
包含一些相关依赖,要确保子模块被更新,请在构建器使用如下命令检查:

至于其他 Windows 应用是否有机会用上这种顺滑的输入效果,miniksa
觉得几乎是没机会。这些应用能够以一种简单的方式用任何一门语言来调用一种方法和布局文本(layout
text),而无需手动计算像素或关心它们的字体该采用哪种样式。而恰好 miniksa
手动计算像素、滑动区域和数学应用区域等的方式正是使得 WSL
默认终端输入速度更快的原因。

此外,我们意识到终端的渲染器和输入堆栈可以构建成可重用的 Windows UI
控件,方便其他人可以将其合并到其他应用程序中。

当开始构建全新终端应用程序时,我们探索并评估了几种方法和技术堆栈。最终决定继续使用
C++ 开发,并通过共享上述的现代化组件来实现我们的目标,并基于现代 Windows
应用程序平台和 UI 框架之上进行开发。

但是由于控制台主要的目标是维护向后兼容性,所以尽管这么多年社区一直希望我们能添加一些特性,但是我们不可能再增加这些特性。

Windows 控制台主机程序 conhost.exe是 Windows 原生的命令行体验,它实现了
Windows 的命令行基础架构,同时提供 Windows Console API,
输入引擎、渲染引擎和用户配置信息。本项目中的控制台主机代码实际上是
Windows 中的 conhost.exe 的源码。

发表评论

电子邮件地址不会被公开。 必填项已用*标注