alroyso 4 meses atrás
pai
commit
3b8be93e42
1 arquivos alterados com 17 adições e 10 exclusões
  1. 17 10
      lib/app/utils/WindowsProxyManager.dart

+ 17 - 10
lib/app/utils/WindowsProxyManager.dart

@@ -55,41 +55,48 @@ class WindowsProxyManager {
   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.dwOptionCount = 3; // 设置为3个选项
     proxyInfo.ref.dwOptionError = 0;
 
-    final options = calloc<INTERNET_PER_CONN_OPTION>(2);
+    // 分配三个选项的空间
+    final options = calloc<INTERNET_PER_CONN_OPTION>(3);
+
+    // 启用代理
+    options[0].dwOption = INTERNET_OPTION_PROXY_ENABLE;
+    options[0].Value.dwValue = 1; // 1 表示启用代理
 
     // 设置代理服务器
-    options[0].dwOption = INTERNET_OPTION_PROXY_SERVER;
-    options[0].Value.pszValue = proxyServer.toNativeUtf16();
+    options[1].dwOption = INTERNET_OPTION_PROXY_SERVER;
+    options[1].Value.pszValue = proxyServer.toNativeUtf16();
 
     // 设置绕过列表
-    options[1].dwOption = INTERNET_OPTION_PROXY_BYPASS;
-    options[1].Value.pszValue = bypassList.toNativeUtf16();
+    options[2].dwOption = INTERNET_OPTION_PROXY_BYPASS;
+    options[2].Value.pszValue = bypassList.toNativeUtf16();
 
     proxyInfo.ref.pOptions = options;
 
+    // 调用 API 设置代理
     final result = _internetSetOption(
       0,
-      INTERNET_OPTION_SETTINGS_CHANGED,
+      INTERNET_OPTION_PER_CONNECTION_OPTION,
       proxyInfo.cast<Void>(),
       proxyInfo.ref.dwSize,
     );
 
     if (result != 0) {
+      _internetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, nullptr, 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[2].Value.pszValue);
     calloc.free(options);
   }
-
   void disableSystemProxy() {
     final proxyInfo = calloc<INTERNET_PER_CONN_OPTION_LIST>();
     proxyInfo.ref.dwSize = sizeOf<INTERNET_PER_CONN_OPTION_LIST>();
@@ -152,9 +159,9 @@ base class INTERNET_PER_CONN_OPTION_Union extends Union {
 const INTERNET_OPTION_PROXY_ENABLE = 3;
 const INTERNET_OPTION_PROXY_SERVER = 2;
 const INTERNET_OPTION_PROXY_BYPASS = 3;
-const INTERNET_OPTION_PER_CONNECTION_OPTION = 75;
 const INTERNET_OPTION_SETTINGS_CHANGED = 39;
 const INTERNET_OPTION_REFRESH = 37;
+const INTERNET_OPTION_PER_CONNECTION_OPTION = 75;
 
 // void main() {
 //   if (Platform.isWindows) {