@@ -80,10 +80,13 @@ public SystemProxyManager()
80
80
/// <param name="protocolType"></param>
81
81
internal void SetProxy ( string hostname , int port , ProxyProtocolType protocolType )
82
82
{
83
- var reg = Registry . CurrentUser . OpenSubKey ( regKeyInternetSettings , true ) ;
84
-
85
- if ( reg != null )
83
+ using ( var reg = OpenInternetSettingsKey ( ) )
86
84
{
85
+ if ( reg == null )
86
+ {
87
+ return ;
88
+ }
89
+
87
90
saveOriginalProxyConfiguration ( reg ) ;
88
91
prepareRegistry ( reg ) ;
89
92
@@ -124,9 +127,13 @@ internal void SetProxy(string hostname, int port, ProxyProtocolType protocolType
124
127
/// </summary>
125
128
internal void RemoveProxy ( ProxyProtocolType protocolType , bool saveOriginalConfig = true )
126
129
{
127
- var reg = Registry . CurrentUser . OpenSubKey ( regKeyInternetSettings , true ) ;
128
- if ( reg != null )
130
+ using ( var reg = OpenInternetSettingsKey ( ) )
129
131
{
132
+ if ( reg == null )
133
+ {
134
+ return ;
135
+ }
136
+
130
137
if ( saveOriginalConfig )
131
138
{
132
139
saveOriginalProxyConfiguration ( reg ) ;
@@ -161,10 +168,13 @@ internal void RemoveProxy(ProxyProtocolType protocolType, bool saveOriginalConfi
161
168
/// </summary>
162
169
internal void DisableAllProxy ( )
163
170
{
164
- var reg = Registry . CurrentUser . OpenSubKey ( regKeyInternetSettings , true ) ;
165
-
166
- if ( reg != null )
171
+ using ( var reg = OpenInternetSettingsKey ( ) )
167
172
{
173
+ if ( reg == null )
174
+ {
175
+ return ;
176
+ }
177
+
168
178
saveOriginalProxyConfiguration ( reg ) ;
169
179
170
180
reg . SetValue ( regProxyEnable , 0 ) ;
@@ -176,10 +186,13 @@ internal void DisableAllProxy()
176
186
177
187
internal void SetAutoProxyUrl ( string url )
178
188
{
179
- var reg = Registry . CurrentUser . OpenSubKey ( regKeyInternetSettings , true ) ;
180
-
181
- if ( reg != null )
189
+ using ( var reg = OpenInternetSettingsKey ( ) )
182
190
{
191
+ if ( reg == null )
192
+ {
193
+ return ;
194
+ }
195
+
183
196
saveOriginalProxyConfiguration ( reg ) ;
184
197
reg . SetValue ( regAutoConfigUrl , url ) ;
185
198
refresh ( ) ;
@@ -188,10 +201,13 @@ internal void SetAutoProxyUrl(string url)
188
201
189
202
internal void SetProxyOverride ( string proxyOverride )
190
203
{
191
- var reg = Registry . CurrentUser . OpenSubKey ( regKeyInternetSettings , true ) ;
192
-
193
- if ( reg != null )
204
+ using ( var reg = OpenInternetSettingsKey ( ) )
194
205
{
206
+ if ( reg == null )
207
+ {
208
+ return ;
209
+ }
210
+
195
211
saveOriginalProxyConfiguration ( reg ) ;
196
212
reg . SetValue ( regProxyOverride , proxyOverride ) ;
197
213
refresh ( ) ;
@@ -205,10 +221,13 @@ internal void RestoreOriginalSettings()
205
221
return ;
206
222
}
207
223
208
- var reg = Registry . CurrentUser . OpenSubKey ( regKeyInternetSettings , true ) ;
209
-
210
- if ( reg != null )
224
+ using ( var reg = Registry . CurrentUser . OpenSubKey ( regKeyInternetSettings , true ) )
211
225
{
226
+ if ( reg == null )
227
+ {
228
+ return ;
229
+ }
230
+
212
231
var ov = originalValues ;
213
232
if ( ov . AutoConfigUrl != null )
214
233
{
@@ -246,26 +265,43 @@ internal void RestoreOriginalSettings()
246
265
reg . DeleteValue ( regProxyOverride , false ) ;
247
266
}
248
267
268
+ // This should not be needed, but sometimes the values are not stored into the registry
269
+ // at system shutdown without flushing.
270
+ reg . Flush ( ) ;
271
+
249
272
originalValues = null ;
250
- refresh ( ) ;
273
+
274
+ const int SM_SHUTTINGDOWN = 0x2000 ;
275
+ Version windows7Version = new Version ( 6 , 1 ) ;
276
+ if ( Environment . OSVersion . Version > windows7Version ||
277
+ NativeMethods . GetSystemMetrics ( SM_SHUTTINGDOWN ) == 0 )
278
+ {
279
+ // Do not call refresh() in Windows 7 or earlier at system shutdown.
280
+ // SetInternetOption in the refresh method re-enables ProxyEnable registry value
281
+ // in Windows 7 or earlier at system shutdown.
282
+ refresh ( ) ;
283
+ }
251
284
}
252
285
}
253
286
254
287
internal ProxyInfo GetProxyInfoFromRegistry ( )
255
288
{
256
- var reg = Registry . CurrentUser . OpenSubKey ( regKeyInternetSettings , true ) ;
257
-
258
- if ( reg != null )
289
+ using ( var reg = OpenInternetSettingsKey ( ) )
259
290
{
291
+ if ( reg == null )
292
+ {
293
+ return null ;
294
+ }
295
+
260
296
return getProxyInfoFromRegistry ( reg ) ;
261
297
}
262
-
263
- return null ;
264
298
}
265
299
266
300
private ProxyInfo getProxyInfoFromRegistry ( RegistryKey reg )
267
301
{
268
- var pi = new ProxyInfo ( null , reg . GetValue ( regAutoConfigUrl ) as string , reg . GetValue ( regProxyEnable ) as int ? ,
302
+ var pi = new ProxyInfo ( null ,
303
+ reg . GetValue ( regAutoConfigUrl ) as string ,
304
+ reg . GetValue ( regProxyEnable ) as int ? ,
269
305
reg . GetValue ( regProxyServer ) as string ,
270
306
reg . GetValue ( regProxyOverride ) as string ) ;
271
307
@@ -307,5 +343,13 @@ private static void refresh()
307
343
NativeMethods . InternetSetOption ( IntPtr . Zero , InternetOptionSettingsChanged , IntPtr . Zero , 0 ) ;
308
344
NativeMethods . InternetSetOption ( IntPtr . Zero , InternetOptionRefresh , IntPtr . Zero , 0 ) ;
309
345
}
346
+
347
+ /// <summary>
348
+ /// Opens the registry key with the internet settings
349
+ /// </summary>
350
+ private static RegistryKey OpenInternetSettingsKey ( )
351
+ {
352
+ return Registry . CurrentUser . OpenSubKey ( regKeyInternetSettings , true ) ;
353
+ }
310
354
}
311
355
}
0 commit comments