0

当我用新的 NK.bin 文件更新我的系统时,我想保持我以前的语言配置。

有人建议我从注册表中读取信息,然后复制我的新 NK.bin 文件,替换当前的 NK.bin(是的,您可以在 Windows 使用该 NK.bin 文件运行时执行此操作)。完成后,我将值写回注册表。

我的理解是重启后会影响NK.bin。这意味着系统在重新启动期间不应该在这里注意到它是一个新的 NK.bin 文件。

它工作正常,注册表改变了它的值。但是,当我进行更新时,它以重新启动系统结束。

当我重新启动后登录时,注册表更改为正确/加载的值,但它显示错误的语言。然后再次重新启动后,语言是正确的。

我想直接处理这个问题,让系统从一开始就以正确的语言启动。

下面的代码显示了我在重新启动之前更新的最后一步。新的 NK.bin 文件只是被复制并替换了旧文件。

还应该说以下寄存器已更改,但要到第二次重新启动才会生效:

  • cSysLang = @"MUI";
  • cDefaultLCID = @"nls";
  • cTouchCalibrationData = @"HARDWARE\DEVICEMAP\TOUCH";
  • cKeyboardDefaultSubKeyStr = @"键盘布局\预加载";
  • cLangSubKeyStrCurrUsr = @"MUI";
  • cLangSubKeyStr = @"nls\overrides";

       private void LoadDataAfterInstallation()
    {
    
        //langauge
        Microsoft.Win32.RegistryKey regLanguage = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(cLangSubKeyStrCurrUsr, true);
        if (!(languageRegInfo==0))
            regLanguage.SetValue("CurLang", languageRegInfo);
    
4

2 回答 2

1

首先让我们讨论一下持久注册表是如何工作的。我将假设这是一个较新的设备,并且它使用基于配置单元的注册表(有一个旧的持久性机制以完全不同的方式工作,但自 4.x 天以来我还没有看到太多)。

该设备有一个基线注册表配置单元,操作系统在首次启动时加载该配置单元 (system.hv)。然后它将您的更改 (user.hv) 应用到该基线注册表。现在,在加载其中任何一个之前,操作系统应该对 NK.BIN 进行校验和,如果它不同,它应该丢弃两者并重新创建它们。旧操作系统的注册表不能保证对新操作系统有效,并且为了理智起见,它们永远不应该被使用。

所以顺序应该是这样的:

  • 读取注册表
  • 更新 NK.BIN
  • 重新开始
    • 操作系统删除旧注册表
    • 操作系统在默认注册表中加载默认语言
  • 为新语言编写注册表值
  • 重新开始
    • 操作系统加载新的注册表更改
    • 操作系统加载新语言

这,我想是你在哪里,是吗?

操作系统需要第二次重新启动才能看到您所做的注册表更改。您可以_SETTINGS_CHANGE通过在恢复值后广播 WM 来避免第二次重新启动(我不确定 - 自从我测试这个并且不记得了) 。作为权威资源,请查看控制面板源代码以了解当用户使用 UI 更改操作系统语言时它在做什么。

于 2013-09-17T15:00:14.087 回答
0

如果您使用的是 MUI,我认为您无法避免重新启动。某些设置可能会动态刷新,但语言不会。但是,您可以在重新导入注册表后立即以编程方式重新启动设备。这不是一个选择吗?您可以在映像内的 reg 中包含一个密钥,并在启动完成时更改它。如果您有图像值,则意味着需要恢复注册表。您恢复它,设置新值,然后自动重新启动机器。这对您的用户来说应该是一个小小的不便。

于 2013-09-18T13:58:28.670 回答