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 代码更改注册表项的主要内容,如果未能解决你的问题,请参考以下文章