using Microsoft.Win32;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Windows.Forms;
namespace IP
{
public partial class Form1 : Form
{
private List<ProxyInfo> proxyList;
public Form1()
{
InitializeComponent();
// 订阅窗体的 FormClosing 事件
this.FormClosing += Form1_FormClosing;
}
这段代码包含了命名空间的引用以及窗体类的定义。其中,proxyList 是用于存储代理信息列表的私有成员变量。
private void uiButton1_Click(object sender, EventArgs e)
{
DisableInternetProxy2();
string url = uiTextBox1.Text;
// 创建WebClient对象
using (WebClient client = new WebClient())
{
try
{
// 设置字符串的编码方式为UTF-8
client.Encoding = Encoding.UTF8;
// 发起GET请求并获取JSON数据
string json = client.DownloadString(url);
// 解析JSON数据
var result = JsonConvert.DeserializeObject<ApiResponse>(json);
// 检查返回代码和成功标志
if (result.code == 0 && result.success)
{
// 获取代理IP信息列表
proxyList = result.data;
// 清空ListBox并添加所有代理信息
listBox1.Items.Clear();
foreach (var proxyInfo in proxyList)
{
string proxyString = $"{proxyInfo.IP} : {proxyInfo.Port} - {proxyInfo.IpAddress}";
listBox1.Items.Add(proxyString);
}
}
else
{
// 显示错误信息
MessageBox.Show("获取数据时出现错误:" + result.msg, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (Exception ex)
{
MessageBox.Show("获取数据时出现错误:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
这是一个名为 uiButton1_Click 的事件处理方法,当名为 uiButton1 的按钮被单击时触发。该方法的作用是从指定的 URL 获取 JSON 数据,并将其解析为 ApiResponse 对象。如果获取成功,它会将代理信息添加到 listBox1 控件中。如果获取失败,将显示相应的错误信息。
private void uiButton2_Click(object sender, EventArgs e)
{
if (listBox1.SelectedIndex >= 0)
{
// 获取选定的代理信息
var selectedProxy = proxyList[listBox1.SelectedIndex];
// 设置代理服务器
SetInternetProxy(selectedProxy.IP, selectedProxy.Port);
}
else
{
MessageBox.Show("请选择一个代理服务器!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
这是一个名为 uiButton2_Click 的事件处理方法,当名为 uiButton2 的按钮被单击时触发。它首先检查是否选定了代理服务器(通过检查 listBox1 控件的选定索引),然后根据选定的代理信息调用 SetInternetProxy 方法来设置代理服务器。
private void SetInternetProxy(string proxyAddress, int proxyPort)
{
try
{
// 打开注册表项
using (RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true))
{
// 设置代理服务器地址和端口
registry.SetValue("ProxyServer", $"{proxyAddress}:{proxyPort}");
registry.SetValue("ProxyEnable", 1);
// 通知系统代理已更改
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
}
MessageBox.Show("代理服务器设置成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show("设置代理服务器时出现错误:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
这是一个名为 SetInternetProxy 的方法,用于设置代理服务器。它使用 RegistryKey 类打开注册表项,然后将代理服务器的地址和端口存储在注册表中。最后,通过调用 InternetSetOption 函数通知系统代理已更改。
private void DisableInternetProxy()
{
try
{
// 打开注册表项
using (RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true))
{
// 清除代理服务器地址和端口
registry.DeleteValue("ProxyServer", false);
registry.SetValue("ProxyEnable", 0);
// 通知系统代理已更改
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
}
MessageBox.Show("已断开代理服务器,使用直接连接!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show("断开代理服务器时出现错误:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
这是一个名为 DisableInternetProxy 的方法,用于禁用代理服务器。它使用 RegistryKey 类打开注册表项,然后删除注册表中的代理服务器地址和端口值,并将代理启用标志设置为 0。最后,通过调用 InternetSetOption 函数通知系统代理已更改。
private const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
private const int INTERNET_OPTION_REFRESH = 37;
[System.Runtime.InteropServices.DllImport("wininet.dll")]
private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
这部分代码定义了两个常量 INTERNET_OPTION_SETTINGS_CHANGED 和 INTERNET_OPTION_REFRESH,它们是用于调用 InternetSetOption 函数时指定选项的整数值。然后,通过 DllImport 特性导入了名为 InternetSetOption 的外部函数,该函数位于 wininet.dll 库中,用于设置和刷新网络设置。
private class ApiResponse
{
public int code { get; set; }
public bool success { get; set; }
public string msg
这部分代码定义了一个名为 ApiResponse
的内部类,用于解析从服务器返回的 JSON 数据。该类包含了 code
、success
、msg
和 data
四个属性,与返回的 JSON 数据对应。
private class ProxyInfo
{
public string IP { get; set; }
public int Port { get; set; }
public string IpAddress { get; set; }
}
这部分代码定义了一个名为 ProxyInfo 的内部类,表示代理信息。它包含了代理服务器的 IP 地址 (IP 属性)、端口号 (Port 属性) 以及 IP 地址的描述 (IpAddress 属性)。
private void uiButton3_Click(object sender, EventArgs e)
{
DisableInternetProxy();
}
这是一个名为 uiButton3_Click 的事件处理方法,当名为 uiButton3 的按钮被单击时触发。它调用 DisableInternetProxy 方法来禁用代理服务器。
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// 关闭软件时自动断开代理服务器并清除代理设置
DisableInternetProxy();
}
是一个名为 Form1_FormClosing 的事件处理方法,当窗体关闭时触发。它在关闭窗体之前调用 DisableInternetProxy 方法来禁用代理服务器。
private void DisableInternetProxy2()
{
try
{
// 打开注册表项
using (RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true))
{
// 清除代理服务器地址和端口
registry.DeleteValue("ProxyServer", false);
registry.SetValue("ProxyEnable", 0);
// 通知系统代理已更改
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
}
}
catch (Exception ex)
{
MessageBox.Show("断开代理服务器时出现错误:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
这是一个名为 DisableInternetProxy2 的方法,与 DisableInternetProxy 方法类似,用于禁用代理服务器。它使用 RegistryKey 类打开注册表项,然后删除注册表中的代理服务器地址和端口值,并将代理启用标志设置为 0。与 DisableInternetProxy 方法不同的是,它没有显示消息框。
private void uiTextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Return)
{
uiButton1.PerformClick();
}
}
}
}
这是一个名为 uiTextBox1_KeyPress 的事件处理方法,当在名为 uiTextBox1 的文本框中按下回车键时触发。它检测按下的键是否是回车键,如果是,则模拟点击 uiButton1 按钮,以执行与该按钮关联的操作。
免责声明
本学习笔记旨在提供编程语言和相关主题的信息和资源,帮助读者学习和掌握编程技能。然而,请注意以下事项:
准确性和完整性:尽管本博客内容经过精心编写和研究,但作者无法保证信息始终准确、完整或最新。编程语言和技术领域不断发展,读者应自行核实和查阅官方文档以确保信息的最新和准确。
文章评论