|
@@ -0,0 +1,133 @@
|
|
|
+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<Void>, int) _internetSetOption;
|
|
|
+
|
|
|
+ WindowsProxyManager() {
|
|
|
+ _initializeFunctions();
|
|
|
+ }
|
|
|
+
|
|
|
+ void _initializeFunctions() {
|
|
|
+ _internetSetOption = _winInet
|
|
|
+ .lookup<NativeFunction<Int32 Function(IntPtr, Uint32, Pointer<Void>, Uint32)>>('InternetSetOptionW')
|
|
|
+ .asFunction();
|
|
|
+ }
|
|
|
+
|
|
|
+ void setSystemProxy(String proxyServer, {String bypassList = ""}) {
|
|
|
+ final proxyInfo = calloc<INTERNET_PER_CONN_OPTION_LIST>();
|
|
|
+ proxyInfo.ref.dwSize = sizeOf<INTERNET_PER_CONN_OPTION_LIST>();
|
|
|
+ proxyInfo.ref.dwOptionCount = 2;
|
|
|
+ proxyInfo.ref.dwOptionError = 0;
|
|
|
+
|
|
|
+ final options = calloc<INTERNET_PER_CONN_OPTION>(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<Void>(),
|
|
|
+ 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<INTERNET_PER_CONN_OPTION_LIST>();
|
|
|
+ proxyInfo.ref.dwSize = sizeOf<INTERNET_PER_CONN_OPTION_LIST>();
|
|
|
+ proxyInfo.ref.dwOptionCount = 1;
|
|
|
+ proxyInfo.ref.dwOptionError = 0;
|
|
|
+
|
|
|
+ final options = calloc<INTERNET_PER_CONN_OPTION>(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<Void>(),
|
|
|
+ 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<INTERNET_PER_CONN_OPTION> 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<Utf16> 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: "<local>");
|
|
|
+//
|
|
|
+// // 禁用系统代理
|
|
|
+// proxyManager.disableSystemProxy();
|
|
|
+// } else {
|
|
|
+// print("该代码仅支持 Windows 平台.");
|
|
|
+// }
|
|
|
+// }
|