在Windows XP中以编程方式更改默认代码页?(来自Delphi)

6
有人能够指导如何以编程方式更改默认的Windows XP代码页吗?(我正在使用Delphi进行此操作)?(这相当于进入控制面板->区域设置->非Unicode应用程序语言)。
在这种情况下,我想切换到简体中文,因此正在写入以下注册表字符串: HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage\ ACP=936 MACCP=10008 OEMCP=936
(这正是在控制面板中更改非Unicode代码页下拉列表所做的)。 我必须更改另一个设置 - 我更喜欢使用Win API调用(如果可用),而不是自己写入注册表。
我还尝试了设置 HKLM\SYSTEM\CurrentControlSet\Control\Nls\Language\ Default=0804 (简体中文)但没有成功。
我不想更改“区域设置”本身,因为这也会更改时间/日期设置、分隔符等等。
这是因为我正在使用一个需要呈现中文字符的ANSI应用程序,并且我正在编写一个工具来自动切换系统以显示这些字符(同时保留UI的其他方面)。
谢谢! Duncan
1个回答

9
这种情况只有在编写类似信息亭的应用程序时才适用,因为这会影响系统上的所有其他应用程序。如果您只需要呈现字符并可以将它们放入WideString中,则可以通过直接调用Windows API的W版本而不是通过TCanvas方法来呈现它们在旧版本的Delphi中运行。也就是说,调用DrawTextWExtTextOutW而不是TCanvas.TextOut,它将绘制Unicode字符而不将其转换为系统的ANSI代码页。

更完整的选择是TMS Unicode Component Pack。它支持在Delphi 6-2007中制作Unicode启用应用程序,并为您处理调用所有W函数。它运行良好,您可以像正常情况下一样使用TCanvas或Caption/Text属性;唯一的区别是所有属性都是WideStrings。最初它是TNT Unicode Controls包,这里有一个较旧的不受支持的版本here

最后,您可以使用微软的AppLocale实用程序仅更改应用程序的ANSI代码页。有关从批处理脚本中调用它的详细信息在这里,可以运行它而不显示烦人的屏幕在这里,以及一个名为SBAppLocale的命令行克隆版。它可以工作,但这是一种hack方法,其他选项更加长期稳定。

Craig - 是的,这是一个控制台应用程序,在PC上运行时我们的软件是唯一可见的应用程序(除了Windows shell)。所涉及的ANSI软件已经编写完成,我无法更改它(针对这种情况)。我只是在编写一个单独的实用工具来切换Windows代码页。AppLocale看起来不错。我仍然认为最好的解决方案是切换非Unicode代码页,但我不知道如何在不手动点击控制面板-->区域设置中的下拉选项的情况下实现这一点。无论如何,非常感谢提供如此丰富的解决方案! - Duncan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接