alroyso 4 bulan lalu
induk
melakukan
c1723a306c
1 mengubah file dengan 133 tambahan dan 0 penghapusan
  1. 133 0
      lib/app/utils/WindowsProxyManager.dart

+ 133 - 0
lib/app/utils/WindowsProxyManager.dart

@@ -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 平台.");
+//   }
+// }