import 'dart:ffi'; import 'dart:io'; import 'package:ffi/ffi.dart'; class WindowsProxyManager { final DynamicLibrary _winInet = DynamicLibrary.open("wininet.dll"); late final int Function(int, int, Pointer, int) _internetSetOption; WindowsProxyManager() { _initializeFunctions(); } void _initializeFunctions() { _internetSetOption = _winInet .lookup, Uint32)>>('InternetSetOptionW') .asFunction(); } void setSystemProxy(String proxyServer, {String bypassList = ""}) { final proxyInfo = calloc(); proxyInfo.ref.dwSize = sizeOf(); proxyInfo.ref.dwOptionCount = 2; proxyInfo.ref.dwOptionError = 0; final options = calloc(2); // Set proxy server option options[0].dwOption = INTERNET_OPTION_PER_CONNECTION_OPTION; options[0].Value.pszValue = proxyServer.toNativeUtf16(); // Set bypass list option options[1].dwOption = INTERNET_OPTION_PER_CONNECTION_OPTION; options[1].Value.pszValue = bypassList.toNativeUtf16(); proxyInfo.ref.pOptions = options; final result = _internetSetOption( 0, INTERNET_OPTION_SETTINGS_CHANGED, proxyInfo.cast(), proxyInfo.ref.dwSize, ); if (result != 0) { _internetSetOption(0, INTERNET_OPTION_REFRESH, nullptr, 0); print("系统代理已设置为: $proxyServer"); } else { print("设置代理失败。"); } calloc.free(proxyInfo); calloc.free(options[0].Value.pszValue); calloc.free(options[1].Value.pszValue); calloc.free(options); } void disableSystemProxy() { final proxyInfo = calloc(); proxyInfo.ref.dwSize = sizeOf(); proxyInfo.ref.dwOptionCount = 1; proxyInfo.ref.dwOptionError = 0; final options = calloc(1); // Disable proxy options[0].dwOption = INTERNET_OPTION_PER_CONNECTION_OPTION; options[0].Value.dwValue = 0; proxyInfo.ref.pOptions = options; final result = _internetSetOption( 0, INTERNET_OPTION_SETTINGS_CHANGED, proxyInfo.cast(), proxyInfo.ref.dwSize, ); if (result != 0) { _internetSetOption(0, INTERNET_OPTION_REFRESH, nullptr, 0); print("系统代理已禁用"); } else { print("禁用代理失败。"); } calloc.free(proxyInfo); calloc.free(options); } } // INTERNET_PER_CONN_OPTION_LIST 结构定义 base class INTERNET_PER_CONN_OPTION_LIST extends Struct { @Uint32() external int dwSize; @IntPtr() external int pszConnection; @Uint32() external int dwOptionCount; @Uint32() external int dwOptionError; external Pointer pOptions; } base class INTERNET_PER_CONN_OPTION extends Struct { @Uint32() external int dwOption; external INTERNET_PER_CONN_OPTION_Union Value; } base class INTERNET_PER_CONN_OPTION_Union extends Union { @Uint32() external int dwValue; external Pointer pszValue; } // 常量定义 const INTERNET_OPTION_PER_CONNECTION_OPTION = 75; const INTERNET_OPTION_SETTINGS_CHANGED = 39; const INTERNET_OPTION_REFRESH = 37; // void main() { // if (Platform.isWindows) { // final proxyManager = WindowsProxyManager(); // // // 设置系统代理 // proxyManager.setSystemProxy("http=127.0.0.1:8888;https=127.0.0.1:8888", bypassList: ""); // // // 禁用系统代理 // proxyManager.disableSystemProxy(); // } else { // print("该代码仅支持 Windows 平台."); // } // }