设置和取消WebBrowser控件代理服务器

      利用WebBrowser控件来辅助开发一些智能小软件,应该很多开发人员都尝试过。前段时间给一用户做一个验号器小软件,却碰到会禁用ip的问题。不过这也很正常,一般的安全性还可以的站点都会有这个限制。为了解决这个问题,去查阅了一些前辈的经验,通过更换代理服务器地址和端口号可以避免ip被限制。

      后来我通过调用wininet.dll 的InternetSetOption方法来动态设定WebBrower控件的代理服务器,以便临时跟换代理服务器地址来欺骗WEB服务器对ip的验证。网上已经有很多人实现到了,但看了很多都只是设置代理服务器的方法,却很少有怎么取消代理的方法。因此在这里我重新组织了一下。把设置代理和取消代理的方法都归纳到一个类中和大家分享一下,不过在测试中也发现到了一些问题,通过InternetSetOption设置的代理只能欺骗某些网站,并不是非常的完美,初步分析这个可能与站点获取客户端ip的方式有关,具体什么原因没有深究,有知道的可以告诉下我,谢谢!)。

      这里取消代理设置其实也挺简单的,它也是利用的InternetSetOption方法来实现,只是传人的参数不同,代理服务器地址和端口号的字符串为空就可以了。具体可以看以下代码。

 

下面是整理的代码(已测试,拿过去就可以用):

1 #region Copyright & License
2  //
3  // Copyright 2011-2011 鲨鱼 MyHelperLib
4  // 此为共享代码,不涉及任何版权!
5 // QQ:56427709
6 // http://56427709.qzone.qq.com/
7 //
8 #endregion
9
10 namespace MyHelperLib.IE
11 {
12 using System;
13 using System.Runtime.InteropServices;
14
15 /// <summary>
16 /// 设置WebBrowser控件的代理服务
17 /// 设置后不会影响IE浏览器
18 /// MSDN:http://msdn.microsoft.com/en-us/library/aa385114%28v=vs.85%29.aspx
19 /// </summary>
20 public class IEProxy
21 {
22 private const int INTERNET_OPTION_PROXY = 38;
23 private const int INTERNET_OPEN_TYPE_PROXY = 3;
24 private const int INTERNET_OPEN_TYPE_DIRECT = 1;
25
26 private string ProxyStr;
27
28 [DllImport("wininet.dll", SetLastError = true)]
29 private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);
30
31 public struct Struct_INTERNET_PROXY_INFO
32 {
33 public int dwAccessType;
34 public IntPtr proxy;
35 public IntPtr proxyBypass;
36 }
37
38 /// <summary>
39 /// 设置WebBrowser控件代理服务
40 /// </summary>
41 /// <param name="strProxy"></param>
42 /// <returns></returns>
43 private bool InternetSetOption(string strProxy)
44 {
45 int bufferLength;
46 IntPtr intptrStruct;
47 Struct_INTERNET_PROXY_INFO struct_IPI;
48
49 if (string.IsNullOrEmpty(strProxy) || strProxy.Trim().Length == 0)
50 {
51 strProxy = string.Empty;
52 struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_DIRECT;
53 }
54 else
55 {
56 struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
57 }
58
59 struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy);
60 struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local");
61
62 bufferLength = Marshal.SizeOf(struct_IPI);
63 intptrStruct = Marshal.AllocCoTaskMem(bufferLength);
64 Marshal.StructureToPtr(struct_IPI, intptrStruct, true);
65
66 return InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, bufferLength);
67 }
68
69 public IEProxy(string strProxy)
70 {
71 this.ProxyStr = strProxy;
72 }
73
74 /// <summary>
75 /// 设置IE代理服务
76 /// </summary>
77 /// <returns></returns>
78 public bool RefreshIESettings()
79 {
80 return InternetSetOption(this.ProxyStr);
81 }
82
83 /// <summary>
84 /// 取消IE代理服务
85 /// </summary>
86 /// <returns></returns>
87 public bool DisableIEProxy()
88 {
89 return InternetSetOption(string.Empty);
90 }
91 }
92 }

MSDN参考地址:http://msdn.microsoft.com/en-us/library/aa385114%28v=vs.85%29.aspx

posted @ 2011-03-09 17:12  鲨鱼^_^  阅读(2875)  评论(4)    收藏  举报