假设您无法使用 Windows 原生 API 调用,我将提供一个解决方案,该解决方案只需要调用 Windows 命令 ( reg
) 和数组/字符串操作,“Racket”语言必须确保实现这一点。
这不是最干净的方法,但考虑到要求,它对您来说应该是一个可行的解决方案。
好吧,您可能已经注意到,不同连接的代理配置存储在键下:HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections
在该键下有一个存储 DefaultConnectionSettings 的值和另一个存储 SavedLegacySettings 的值(均为 REG_BINARY 类型)。除了提到的两个值之外,每个系统连接(也是 REG_BINARY 类型)都有一个值,用于存储连接配置,包括代理设置。值的名称等于连接名称。
幸运的是,有些人已经对存储在这些值中的 BINARY 数据的结构进行了逆向工程。
- 字节数零总是有 3C 或 46 - 我找不到关于这个字节的更多信息。接下来的三个字节是零。
- 字节数 4 是“Internet 选项”属性表(Internet Explorer->Tools->Internet 选项...)使用的计数器。当您手动更改 Internet 设置(例如“连接”选项卡中的 LAN 设置)时,此计数器会增加。它不是很有用的字节。但它必须有一个值。我始终保持为零。接下来的三个字节为零(字节 5 到 7)。
- 根据您的设置,字节数 8 可以采用不同的值。值为:
- 09 仅启用“自动检测设置”时
- 03 仅启用“为 LAN 使用代理服务器”时
- 0B 当两者都启用时
- 05 仅启用“使用自动配置脚本”时
- 启用“自动检测设置”和“使用自动配置脚本”时为 0D
- 07 启用“为 LAN 使用代理服务器”和“使用自动配置脚本”时
- 当这三个都启用时为 0F。
- 01 当它们都未启用时。接下来的三个字节为零(字节 9 到 B)。
- 字节数 C(十进制的 12)包含代理服务器地址的长度。例如,代理服务器 '127.0.0.1:80' 的长度为 12(长度包括点和冒号)。接下来的三个字节为零(字节D 到 F)。
- 字节 10(或十进制的 16)包含代理服务器地址 - 例如 '127.0.0.1:80' (其中 80 显然是端口号)
- 地址后面的字节包含附加信息的长度。接下来的三个字节为零。例如,如果勾选了“绕过本地地址的代理服务器”,那么这个字节是 07,接下来的三个字节是零,然后是一个字符串,即 '' ( 表示您正在绕过代理服务器。现在因为有 7 个字符,长度为07!)。您必须自己进行试验才能找到更多相关信息。如果您没有任何附加信息,则长度为 0,并且不添加任何信息。
- 附加信息后面的字节,是自动配置脚本地址的长度(如果你没有脚本地址,那么你不需要添加任何东西,跳过这一步,转到第8步)。接下来的三个字节是零,然后地址来了。
- 最后,附加了 32 个零。(我不知道为什么!大概是为了填充二进制 blob,也许它预计会有一定的长度,你不希望 windows 有一些来源吗?)
完整的信息可以在这里找到。
有了这些信息,我认为您可以设法获取其中的值。只需reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections"
正确解析输出并再次使用 reg 来写回修改。
我希望这有帮助。