C# 注册表项getvalue未获取最新值

C# 注册表项getvalue未获取最新值,c#,C#,我试图通过从我的应用程序中读取HKCU\Keyboard layout\Preload\1来获取当前用户上次使用的键盘布局。每次在控制面板中更改默认键盘时,我都可以看到上面位置的值发生了更改(我可以通过打开RegEdit来看到这一点)。但由于某些原因,我的应用程序仍然读取旧值,而不考虑我在RegEdit上看到的最新刷新 string KeyboardLayoutRegKey = "Keyboard Layout\\Preload"; pLastUsedKeyboard = RegistryAcc

我试图通过从我的应用程序中读取
HKCU\Keyboard layout\Preload\1
来获取当前用户上次使用的键盘布局。每次在控制面板中更改默认键盘时,我都可以看到上面位置的值发生了更改(我可以通过打开RegEdit来看到这一点)。但由于某些原因,我的应用程序仍然读取旧值,而不考虑我在RegEdit上看到的最新刷新

string KeyboardLayoutRegKey = "Keyboard Layout\\Preload";
pLastUsedKeyboard = RegistryAccessor.CurrentUser.OpenSubKey(KeyboardLayoutRegKey).GetValue("1").ToString(),
当我将值从English US更改为French时,注册表中的十六进制值从409更改为40c,我可以在RegEdit中看到这一点,但在我重新启动之前,我的应用程序仍然将其读取为409?为什么会这样?我的应用程序面向任何CPU

编辑

/// <summary>
/// Provides access to the registry. 
/// </summary>
public class RegistryAccessor : IRegistryAccessor
{
    /// <summary>
    /// Contains information about the current user preferences. This field reads the Windows registry base key HKEY_CURRENT_USER.
    /// </summary>
    public IRegistryKey CurrentUser
    {
        get
        {
            return new RegistryKeyWrapper(Registry.CurrentUser);
        }
    }

    /// <summary>
    /// Contains the configuration data for the local machine. This field reads the Windows registry base key HKEY_LOCAL_MACHINE.
    /// </summary>
    public IRegistryKey LocalMachine
    {
        get
        {
            return new RegistryKeyWrapper(Registry.LocalMachine);
        }
    }
    /// <summary>
    /// Contains the configuration data for the Users. This field reads the Windows registry base key HKEY_USERS.
    /// </summary>
    public IRegistryKey Users
    {
        get
        {
            return new RegistryKeyWrapper(Registry.Users);
        }
    }

}
//
///提供对注册表的访问。
/// 
公共类注册表访问器:IRegistryAccessor
{
/// 
///包含有关当前用户首选项的信息。此字段读取Windows注册表基项HKEY\U current\U user。
/// 
公共IRegistryKey当前用户
{
得到
{
返回新的RegistryKeyWrapper(Registry.CurrentUser);
}
}
/// 
///包含本地计算机的配置数据。此字段读取Windows注册表基项HKEY\U local\U machine。
/// 
公共IRegistryKey本地计算机
{
得到
{
返回新的RegistryKeyWrapper(Registry.LocalMachine);
}
}
/// 
///包含用户的配置数据。此字段读取Windows注册表基项HKEY_Users。
/// 
公共IRegistryKey用户
{
得到
{
返回新的RegistryKeyWrapper(Registry.Users);
}
}
}

在不重新启动应用程序的情况下,无法“刷新”注册表值。如果您需要在应用程序运行时收到注册表项值更改的通知,您可以使用WMI来实现。您可以参考帮助您在应用程序中实现它的方法

RegistryAccessor是什么?@pm100 RegistryAccessor是一个围绕注册表的包装器,有助于在单元测试期间进行模拟。我们相信这个类不会做任何奇怪的事情(如缓存),您只展示了一部分。您的应用程序是否作为服务运行,您是否在进行任何用户模拟,以及此系统是否在域网络上?如果它是一项服务,然后说“系统帐户没有HKCU”,我不知道您如何从中获得价值,但我很确定这是您问题的根源。演示如何模拟用户并加载其配置文件,以便您可以直接使用HKCU,但HKCU只是指向用户的符号链接,因此如果您知道SID并具有访问权限,我认为您可以直接访问密钥--请阅读上面关于模拟的链接中“vcsjones”的帖子。