Vb.net WebBrowser控件获胜';t使用文本文件中的代理

Vb.net WebBrowser控件获胜';t使用文本文件中的代理,vb.net,winapi,webbrowser-control,proxies,Vb.net,Winapi,Webbrowser Control,Proxies,我对VisualBasic不是很在行,对此很抱歉,但我对java和其他一些编程语言有基本的了解,所以我不是一个完全陌生的人。 我想制作一个程序,通过从文本文件加载的代理连接到网站,但当我调试它时,它会给我一系列不同的错误消息,如: HTTP错误503。服务不可用 找不到该网页 等等 下面是我将代理加载到列表框中的代码: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) H

我对VisualBasic不是很在行,对此很抱歉,但我对java和其他一些编程语言有基本的了解,所以我不是一个完全陌生的人。
我想制作一个程序,通过从文本文件加载的代理连接到网站,但当我调试它时,它会给我一系列不同的错误消息,如:

  • HTTP错误503。服务不可用
  • 找不到该网页
等等

下面是我将代理加载到列表框中的代码:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    OpenFileDialog1.ShowDialog()
    streamer = IO.File.OpenText(OpenFileDialog1.FileName)
    Dim mystring() As String = streamer.ReadToEnd.Split(vbNewLine)

    ListBox1.Items.AddRange(mystring)
 End Sub
以下是使用代理的代码:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Button2.Enabled = False
    Button1.Enabled = False

    For Each item In ListBox1.Items
        UseProxy(item.ToString)
        Label4.Text = item
        WebBrowser1.Navigate(TextBox3.Text)
        pause(10000)
    Next
End Sub
下面是useproxy:

Private Sub UseProxy(ByVal strProxy As String)
    Const INTERNET_OPTION_PROXY As Integer = 38
    Const INTERNET_OPEN_TYPE_PROXY As Integer = 3

    Dim struct_IPI As Struct_INTERNET_PROXY_INFO
    struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY
    struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy)
    struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local")

    Dim intptrStruct As IntPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI))

    Marshal.StructureToPtr(struct_IPI, intptrStruct, True)
    Dim iReturn As Boolean = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, System.Runtime.InteropServices.Marshal.SizeOf(struct_IPI))
End Sub
我还得到了一个错误,在结束的按钮2点击子说这一点

实际上,有时当我关闭程序时,我在visual studio中的按钮2 click sub(下一步)的末尾出现错误


System.InvalidOperationException:'此枚举数绑定到的列表已被修改。枚举器只能在列表未更改的情况下使用。

我认为这是在系统范围内更改系统代理设置的最直接的方法。
有时,每个连接设置更可取。请参阅本例中的链接文档

使用在Internet设置子项中设置所需的值:
Software\Microsoft\Windows\CurrentVersion\Internet设置

然后,使用
互联网选项\u设置\u更改
互联网选项\u刷新

(这些是标志,但在这种情况下不应合并)
如果使用
internetoption\u PER\u CONNECTION\u OPTION
修改每个连接的设置,则还必须调用
internetoption\u REFRESH

InternetSetOption
和助手函数的声明。

Imports Microsoft.Win32
Imports System.Runtime.InteropServices
Imports System.Security.AccessControl

<SecurityCritical>
<DllImport("wininet.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
Friend Shared Function InternetSetOption(hInternet As IntPtr, dwOption As Integer, lpBuffer As IntPtr, dwBufferLength As Integer) As Boolean
End Function
Friend Const INTERNET_OPTION_SETTINGS_CHANGED As Integer = 39
Friend Const INTERNET_OPTION_REFRESH As Integer = 37

<SecuritySafeCritical>
Private Sub InternetSetProxy(ProxyAddress As String, ProxyPort As Integer, UseProxy As Boolean)
    Dim keyName As String = "Software\Microsoft\Windows\CurrentVersion\Internet Settings"
    Dim KeyValue As Object = ProxyAddress + ":" + ProxyPort.ToString()

    Dim InternetSettingsKey As RegistryKey =
                Registry.CurrentUser.OpenSubKey(keyName,
                RegistryKeyPermissionCheck.ReadWriteSubTree,
                RegistryRights.WriteKey)

    InternetSettingsKey.SetValue("ProxyServer", KeyValue, RegistryValueKind.String)
    InternetSettingsKey.SetValue("ProxyEnable", If(UseProxy, 1, 0), RegistryValueKind.DWord)
    InternetSettingsKey.Close()

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

    InternetSettingsKey.Dispose()
End Sub
要禁用代理设置,只需将
UseProxy
参数设置为
False

InternetSetProxy("127.0.0.1", 8888, False)
像往常一样浏览Internet地址:

WebBrowser1.Navigate("https://www.google.com")
关于.Net WebBrowser控件的说明。
WebBrowser控件使用当前缓存(在Internet Explorer设置中指定)作为预定义行为加载访问过的资源。
如果启用代理,但仍然可以看到网站的(第一)页,这取决于此默认行为。
如果您尝试单击某个链接,则无法访问此新链接,并且消息:

代理服务器没有响应

将呈现。
这种结果不是常数,它取决于缓存设置

编辑:
一种让
WebBrowser
控制
导航
一个或多个Internet地址的方法,为每个地址使用不同的代理服务器:

WebBrowser
事件添加事件处理程序。
当首次调用
WebBrowser.Navigate()
方法时,事件处理程序将在代理列表中循环(从
ListBox
控件
列表中读取)

此代码假定代理列表由以下字符串组成: 包括每个代理的地址和端口。(例如。
“127.0.0.1:8888”
适用于小提琴手)

这里,与OP示例一样,所有代理的Internet地址都是相同的(一个
WaitDocumentsComplete()
方法的参数),但当然可以从另一个列表中读取

DocumentCompleted
处理程序和助手方法
NavigateNextProxy()
都标记为异步,因此在整个过程中不会阻止UI

可以随时使用此方法停止此过程,或将
ProxyIndex
字段设置为负值。
如果流程在自然完成之前中断,则有必要使用以下命令显式删除处理程序:

RemoveHandler WebBrowser1.DocumentCompleted,DocumentCompletedHandler

事件处理程序声明以及包装器和帮助器函数:

Protected Friend DocumentCompletedHandler As WebBrowserDocumentCompletedEventHandler

Private Sub WaitDocumentsComplete(ByVal Address As String, ByVal TimeOutSeconds As Integer)
    DocumentCompletedHandler =
        Async Sub(s, e)
            If WebBrowser1.ReadyState = WebBrowserReadyState.Complete AndAlso ProxyIndex > -1 Then
                If (Not WebBrowser1.IsBusy) Then
                    Dim ProxyParts() As String = ListBox1.GetItemText(ListBox1.Items(ProxyIndex)).Split(":"c)
                    Await NavigateNextProxy(Address, ProxyParts(0), CInt(ProxyParts(1)), TimeOutSeconds)
                    ProxyIndex += 1
                    If ProxyIndex > ProxyIndexMaxValue Then
                        ProxyIndex = -1
                        RemoveHandler WebBrowser1.DocumentCompleted, DocumentCompletedHandler
                    End If
                End If
            End If
        End Sub

    AddHandler WebBrowser1.DocumentCompleted, DocumentCompletedHandler

End Sub

Protected Async Function NavigateNextProxy(Address As String, ByVal ProxyAddr As String, ProxyPort As Integer, TimeOutSeconds As Integer) As Task
    InternetSetProxy(ProxyAddr, ProxyPort, True)
    Await Task.Delay(TimeSpan.FromSeconds(TimeOutSeconds))
    If WebBrowser1.IsBusy Then WebBrowser1.Stop()
    WebBrowser1.Navigate(Address)
End Function
按钮。单击()
事件,设置列表中第一个和最后一个代理的索引,每个
导航之间的超时值(以秒为单位),并调用包装方法
WaitDocumentsComplete()
,该方法将初始化
DocumentCompleted
事件处理程序

要开始此过程,请使用
WebBrowser1初始化
WebBrowser
控件。导航(“”

抑制
WebBrowser
脚本错误对话框也很重要, 否则会影响整个程序


您需要使用
InternetSetOption
传播一条(系统)消息,表明与代理设置相关的注册表值已更改。使用可修改这些注册表设置。(
ProxyServer
[string]=“代理:端口”)和
proxysenable
[dword]您能详细说明一下吗?很抱歉,我没有编写useproxy代码。您需要设置这些注册表值,然后
InternetSetOption
必须生成一个“广播”,告知这些设置已更改,并生成一个“建议”,建议感兴趣的应用程序刷新有关此问题的知识。e、 g.立即将
internetoption\u SETTINGS\u CHANGED=39
消息和
internetoption\u REFRESH=37
消息发送到
hInternet
=
IntPtr.Zero
。如果你需要一个例子,让我知道。是的,我想要一个例子,对不起,回答很好!尽管为什么要调用
Application.DoEvents()
call?@visualVincent好吧,如果您使用的是
WebBrowser
控件,那么您使用的是一个具有消息队列的表单。我们可能也必须处理这一信息。我们引起了一场广播,但我们没有尽力去做?这很粗鲁:)当然,但是消息泵/队列可以自行处理。你不应该强迫它。它是一个
While
循环,用于检查所有t
Protected Friend DocumentCompletedHandler As WebBrowserDocumentCompletedEventHandler

Private Sub WaitDocumentsComplete(ByVal Address As String, ByVal TimeOutSeconds As Integer)
    DocumentCompletedHandler =
        Async Sub(s, e)
            If WebBrowser1.ReadyState = WebBrowserReadyState.Complete AndAlso ProxyIndex > -1 Then
                If (Not WebBrowser1.IsBusy) Then
                    Dim ProxyParts() As String = ListBox1.GetItemText(ListBox1.Items(ProxyIndex)).Split(":"c)
                    Await NavigateNextProxy(Address, ProxyParts(0), CInt(ProxyParts(1)), TimeOutSeconds)
                    ProxyIndex += 1
                    If ProxyIndex > ProxyIndexMaxValue Then
                        ProxyIndex = -1
                        RemoveHandler WebBrowser1.DocumentCompleted, DocumentCompletedHandler
                    End If
                End If
            End If
        End Sub

    AddHandler WebBrowser1.DocumentCompleted, DocumentCompletedHandler

End Sub

Protected Async Function NavigateNextProxy(Address As String, ByVal ProxyAddr As String, ProxyPort As Integer, TimeOutSeconds As Integer) As Task
    InternetSetProxy(ProxyAddr, ProxyPort, True)
    Await Task.Delay(TimeSpan.FromSeconds(TimeOutSeconds))
    If WebBrowser1.IsBusy Then WebBrowser1.Stop()
    WebBrowser1.Navigate(Address)
End Function
Private ProxyIndex As Integer = -1
Private ProxyIndexMaxValue As Integer = 0

Private Sub btnForm2_Click(sender As Object, e As EventArgs) Handles btnForm2.Click
    ProxyIndex = 0
    ProxyIndexMaxValue = ListBox1.Items.Count - 1
    Dim BrowsingTimeoutSeconds As Integer = 3
    Dim Address As String = "https://www.google.com"
    WaitDocumentsComplete(Address, BrowsingTimeoutSeconds)
    WebBrowser1.ScriptErrorsSuppressed = True
    WebBrowser1.Navigate("")
End Sub