alroyso hai 4 meses
pai
achega
cb0d42ad77

+ 16 - 2
lib/app/service/connection_service.dart

@@ -8,6 +8,7 @@ import 'package:naiyouwl/app/controller/service.dart';
 
 import '../controller/GlobalController.dart';
 import '../modules/home/controllers/home_controller.dart';
+import '../utils/WindowsProxyManager.dart';
 import '../utils/utils.dart';
 
 class ConnectionService {
@@ -82,7 +83,7 @@ class ConnectionService {
         } else {
           if (controllers.service.clashServiceIsRuning) {
             globalController.connectStatus.value = true;
-            await globalController.openProxy();
+
           } else {
             throw Exception("内核启动失败");
           }
@@ -97,11 +98,24 @@ class ConnectionService {
           throw Exception("内核启动失败");
         }
       }
-
+      //await globalController.openProxy();
       updateStatus(ConnectionStatus.connected);
       globalController.updateMsg("连接成功");
       controllers.global.connectStatus.value = true;
 
+      //检测系统代理并切换成网卡模式
+      if(Platform.isWindows){
+        final proxyManager = WindowsProxyManager();
+        if(!await proxyManager.isProxyEnabled()){
+          await globalController.TunProxySwitch(true);
+          await globalController.makeProxy();
+          await serviceController.reloadClashCore();
+        }
+
+
+      }
+
+
     } catch (e) {
       updateStatus(ConnectionStatus.disconnected);
       globalController.handleApiError("连接失败: $e");

+ 57 - 7
lib/app/utils/WindowsProxyManager.dart

@@ -5,6 +5,7 @@ import 'package:ffi/ffi.dart';
 class WindowsProxyManager {
   final DynamicLibrary _winInet = DynamicLibrary.open("wininet.dll");
 
+  late final int Function(int, int, Pointer<Void>, Pointer<Uint32>) _internetQueryOption;
   late final int Function(int, int, Pointer<Void>, int) _internetSetOption;
 
   WindowsProxyManager() {
@@ -12,11 +13,45 @@ class WindowsProxyManager {
   }
 
   void _initializeFunctions() {
+    _internetQueryOption = _winInet
+        .lookup<NativeFunction<Int32 Function(IntPtr, Uint32, Pointer<Void>, Pointer<Uint32>)>>(
+        'InternetQueryOptionW')
+        .asFunction();
+
     _internetSetOption = _winInet
-        .lookup<NativeFunction<Int32 Function(IntPtr, Uint32, Pointer<Void>, Uint32)>>('InternetSetOptionW')
+        .lookup<NativeFunction<Int32 Function(IntPtr, Uint32, Pointer<Void>, Uint32)>>(
+        'InternetSetOptionW')
         .asFunction();
   }
 
+  bool isProxyEnabled() {
+    final optionList = calloc<INTERNET_PER_CONN_OPTION_LIST>();
+    optionList.ref.dwSize = sizeOf<INTERNET_PER_CONN_OPTION_LIST>();
+    optionList.ref.dwOptionCount = 1;
+    optionList.ref.dwOptionError = 0;
+
+    final options = calloc<INTERNET_PER_CONN_OPTION>(1);
+    options[0].dwOption = INTERNET_OPTION_PROXY_ENABLE;
+
+    optionList.ref.pOptions = options;
+
+    final optionSize = calloc<Uint32>()..value = sizeOf<INTERNET_PER_CONN_OPTION_LIST>();
+    final result = _internetQueryOption(0, INTERNET_OPTION_PER_CONNECTION_OPTION, optionList.cast<Void>(), optionSize);
+
+    bool isEnabled = false;
+    if (result != 0) {
+      isEnabled = options[0].Value.dwValue != 0;
+    } else {
+      print("检测代理状态失败。");
+    }
+
+    calloc.free(optionList);
+    calloc.free(options);
+    calloc.free(optionSize);
+
+    return isEnabled;
+  }
+
   void setSystemProxy(String proxyServer, {String bypassList = ""}) {
     final proxyInfo = calloc<INTERNET_PER_CONN_OPTION_LIST>();
     proxyInfo.ref.dwSize = sizeOf<INTERNET_PER_CONN_OPTION_LIST>();
@@ -25,12 +60,12 @@ class WindowsProxyManager {
 
     final options = calloc<INTERNET_PER_CONN_OPTION>(2);
 
-    // Set proxy server option
-    options[0].dwOption = INTERNET_OPTION_PER_CONNECTION_OPTION;
+    // 设置代理服务器
+    options[0].dwOption = INTERNET_OPTION_PROXY_SERVER;
     options[0].Value.pszValue = proxyServer.toNativeUtf16();
 
-    // Set bypass list option
-    options[1].dwOption = INTERNET_OPTION_PER_CONNECTION_OPTION;
+    // 设置绕过列表
+    options[1].dwOption = INTERNET_OPTION_PROXY_BYPASS;
     options[1].Value.pszValue = bypassList.toNativeUtf16();
 
     proxyInfo.ref.pOptions = options;
@@ -63,8 +98,8 @@ class WindowsProxyManager {
 
     final options = calloc<INTERNET_PER_CONN_OPTION>(1);
 
-    // Disable proxy
-    options[0].dwOption = INTERNET_OPTION_PER_CONNECTION_OPTION;
+    // 禁用代理
+    options[0].dwOption = INTERNET_OPTION_PROXY_ENABLE;
     options[0].Value.dwValue = 0;
 
     proxyInfo.ref.pOptions = options;
@@ -114,6 +149,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;
@@ -122,11 +160,23 @@ const INTERNET_OPTION_REFRESH = 37;
 //   if (Platform.isWindows) {
 //     final proxyManager = WindowsProxyManager();
 //
+//     // 检测当前系统代理状态
+//     bool isProxyEnabled = proxyManager.isProxyEnabled();
+//     print("系统代理启用状态: ${isProxyEnabled ? "已启用" : "未启用"}");
+//
 //     // 设置系统代理
 //     proxyManager.setSystemProxy("http=127.0.0.1:8888;https=127.0.0.1:8888", bypassList: "<local>");
 //
+//     // 再次检测代理状态
+//     isProxyEnabled = proxyManager.isProxyEnabled();
+//     print("系统代理启用状态: ${isProxyEnabled ? "已启用" : "未启用"}");
+//
 //     // 禁用系统代理
 //     proxyManager.disableSystemProxy();
+//
+//     // 最后检测代理状态
+//     isProxyEnabled = proxyManager.isProxyEnabled();
+//     print("系统代理启用状态: ${isProxyEnabled ? "已启用" : "未启用"}");
 //   } else {
 //     print("该代码仅支持 Windows 平台.");
 //   }