|
@@ -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);
|
|
|
|
|
|
-
|
|
|
- options[0].dwOption = INTERNET_OPTION_PER_CONNECTION_OPTION;
|
|
|
+
|
|
|
+ options[0].dwOption = INTERNET_OPTION_PROXY_SERVER;
|
|
|
options[0].Value.pszValue = proxyServer.toNativeUtf16();
|
|
|
|
|
|
-
|
|
|
- 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);
|
|
|
|
|
|
-
|
|
|
- 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;
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
|