Windows 8+ 中兼容模式的注册表值中波浪号的含义

Wol*_*olf 5 windows-registry compatibility windows-8 windows-8.1

我必须支持最初为 Windows NT 4(32 位)创建的旧应用程序,但在 Windows 10(64 位)下仍然可以正常运行,前提是所有兼容性设置都已完成。问题是这些必须主要由手工完成。

我试图弄清楚如何构建一个我可以为此目的提供的程序或脚本。我已经知道兼容性设置存储在注册表中HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\LayersHKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers分别(根据设置是否适用于所有或单个用户),通过添加值,它们的名称是像实例的应用程序路径

C:\Program Files (x86)\SomeApp\SomeBinary.exe 
Run Code Online (Sandbox Code Playgroud)

添加内容(用于启用与 Windows XP Service Pack 3 的兼容性)

WINXPSP3
Run Code Online (Sandbox Code Playgroud)

在 Windows 7 上观察到,或

~ WINXPSP3
Run Code Online (Sandbox Code Playgroud)

在 Windows 8.1(和 Windows 8)上观察到

在发布这样的工具之前,我想了解的是:

开始值内容的波浪号的目的或含义是什么?

我已经搜索了几个月(谷歌,必应),但到目前为止,我只发现了一些问题。只能猜测它也可能毫无意义(?):

当通过属性设置兼容模式时,Windoze 会在值前放置一个波浪号 (~),后跟一个空格,例如“~ WINXPSP3”。然而,无论波浪号如何,它似乎都有效(或视情况而定)。

但是关于调整兼容性设置的大多数建议似乎都非常注意这个神奇的字符:

请注意,波浪号和 HIGHDPIAWARE 之间有一个空格。

有没有人真正了解它?

小智 1

我正在研究同样的事情并发现了这个(强调我的):

如果该值包含序列波形符 [~],则该值将被解释为 Null 分隔的字符串列表 (REG_MULTI_SZ)。例如,要指定包含三个字符串 a、b 和 c 的列表,请使用“a[~]b[~]c”。

值中的序列 [~] 分隔各个字符串,并被解释并存储为空字符。

如果字符串列表前面有 [~],则字符串将附加到任何现有的注册表值字符串中。如果附加字符串已出现在注册表值中,则该字符串的原始出现位置将被删除。

如果 [~] 位于字符串列表末尾,则该字符串将添加到任何现有注册表值字符串之前。如果注册表值中已出现前置字符串,则该字符串的原始出现位置将被删除。

如果 [~] 既位于字符串列表的开头又位于结尾,或者既不在开头又不在结尾,则这些字符串将替换任何现有的注册表值字符串。

否则,该值将被解释并存储为字符串 (REG_SZ)。

来源:安装程序数据库参考中的注册表表 (Windows)一文

因此,波浪号字符似乎只是附加或前置字符串值。