Windows 7 为什么';Windows 7应用程序首次运行时是否看到虚拟化注册表值?

Windows 7 为什么';Windows 7应用程序首次运行时是否看到虚拟化注册表值?,windows-7,registry,Windows 7,Registry,我已经编写了一个C#程序,该程序首先从HKLM\Software\MyApp读取值,然后将值写入HKLM\Software\MyApp。它是一个没有清单的x86应用程序,我以非管理员身份在Windows 7 x86上运行,因此我希望它能够实际读取和写入相应的虚拟化注册表位置(HKCU\Software\Classes\VirtualStore\Machine\Software\MyApp) 在运行我的应用程序之前,我通过regedit手动在虚拟化位置放置了一个值,在HKLM位置放置了另一个值 我

我已经编写了一个C#程序,该程序首先从HKLM\Software\MyApp读取值,然后将值写入HKLM\Software\MyApp。它是一个没有清单的x86应用程序,我以非管理员身份在Windows 7 x86上运行,因此我希望它能够实际读取和写入相应的虚拟化注册表位置(HKCU\Software\Classes\VirtualStore\Machine\Software\MyApp)

在运行我的应用程序之前,我通过regedit手动在虚拟化位置放置了一个值,在HKLM位置放置了另一个值

我第一次运行应用程序时,它读取HKLM值,但没有看到虚拟化值。但是,当它写入时,它会写入虚拟化位置

但是,在后续运行中(首次写入虚拟化位置后),应用程序会读取虚拟化值,而不是HKLM中的值

我试图找出第一次运行和后续运行之间的哪些变化会导致读数不一致。这不是HKLM\Software\MyApp上的虚拟标志——它们在第一次运行之前和之后都已清除

我在几个不同的用户帐户上重复了这一点。(而且,FWIW,我也看到QuickTime以同样的方式运行,这实际上就是我在玩这个的原因。)值得注意的是,每个用户的第一次运行都有相同的行为,不管不同的用户是否已经在同一台机器上运行过应用程序

这是我的密码:

static void Main(string[] args)
{
    try
    {
        RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\MyApp");
        if (key != null)
        {
            String value = (string)key.GetValue("name");
            Console.WriteLine("read value " + value);
            key.Close();
        }
        else Console.WriteLine("open key for read failed");
        key = Registry.LocalMachine.OpenSubKey("Software\\MyApp", true);
        if (key != null)
        {
            key.SetValue("name", "programValue");
            Console.WriteLine("Wrote value programValue");
        }
        else
            Console.WriteLine("open key for write failed");
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
}
首次运行之前,注册表中有以下值:

HKLM\Software\MyApp:name=“handHKLMValue”
HKCU\Software\Classes\VirtualStore\Machine\Software\MyApp:name=“handVirtualValue”

第一次运行的输出为:

读取值handHKLMValue
写值程序值

查看注册表,我可以看到programValue确实已写入虚拟化位置,覆盖了handVirtualValue。即,注册表现在包含以下值:

HKLM\Software\MyApp:name=“handHKLMValue”
HKCU\Software\Classes\VirtualStore\Machine\Software\MyApp:name=“programValue”

而且,可以肯定的是,后续运行具有以下输出:

读取值编程值
写值程序值

在第一次运行和后续运行之间可能会发生什么变化,我必须做什么(不直接查看虚拟化位置),以便它在第一次运行时读取handVirtualValue