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