Windows 不承认通过 .NET 代码更改注册表项

Posted

技术标签:

【中文标题】Windows 不承认通过 .NET 代码更改注册表项【英文标题】:Windows not acknowledging changes to registry key via .NET code 【发布时间】:2018-03-10 23:25:07 【问题描述】:

我正在尝试使用 .NET 更改 Windows 7 代理设置。我通过在注册表编辑器中通过 F5 刷新密钥本身验证了以下代码成功设置了密钥,但是当我通过控制面板打开 Internet 设置时,Windows 似乎没有确认更改。

但是,当我通过控制面板手动进行更改时,设置会立即生效。

这告诉我控制面板 UI 以某种方式告诉 Windows 重新加载键值,而直接通过 .NET 代码执行它只是设置值而不重新加载。

我可以通过 .NET 代码向 Windows 发出命令以强制它重新加载任何注册表更改吗?

using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.Users, RegistryView.Registry64))
using (var myKey = hklm.OpenSubKey(@"[..]\Software\Microsoft\Windows\CurrentVersion\Internet Settings", true))

    if (myKey != null)
    
        myKey.SetValue("ProxyServer", "00.00.00.00:0000", RegistryValueKind.String);
        myKey.SetValue("ProxyEnable", 1, RegistryValueKind.DWord);
    

更新:我刚刚发现通过控制面板重新打开 Internet 属性会强制刷新。虽然这不是一个可行的解决方案,但它确实确认正在向 Windows 发出一些命令,告诉它重新加载注册表更改。

【问题讨论】:

【参考方案1】:

所以,在问我的问题时,我给了自己更多搜索条件的想法,最终让我看到这篇文章,有人试图做与我现在完全相同的事情:

https://social.technet.microsoft.com/Forums/windowsserver/en-US/7a3011ae-6bea-46e7-80c8-e9bcb93a8cf9/how-can-i-update-the-registry-with-powershell-without-logging-offrebooting?forum=winserverpowershell

它是 Powershell,但我将其转换为 c#。调用InternetSetOption 后,更改立即反映。

[DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);

const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
const int INTERNET_OPTION_REFRESH = 37;

using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.Users, RegistryView.Registry64))
using (var myKey = hklm.OpenSubKey(@"[..]\Software\Microsoft\Windows\CurrentVersion\Internet Settings", true))

    if (myKey != null)
    
        myKey.SetValue("ProxyServer", "00.00.00.00:0000", RegistryValueKind.String);
        myKey.SetValue("ProxyEnable", 1, RegistryValueKind.DWord);

        InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
    

【讨论】:

以上是关于Windows 不承认通过 .NET 代码更改注册表项的主要内容,如果未能解决你的问题,请参考以下文章

.NET 如何更改 windows 默认字体?

跟踪 Windows 注册表中的更改

.Net DLL每次编译都需要重新注册

通过代码动态创建Windows服务

Windows服务启动超时

Windows 通过编辑注册表设置左右手使用习惯更改 Popup 弹出位置