WindowsProxyManager.dart 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import 'dart:ffi';
  2. import 'dart:io';
  3. import 'package:ffi/ffi.dart';
  4. class WindowsProxyManager {
  5. final DynamicLibrary _winInet = DynamicLibrary.open("wininet.dll");
  6. late final int Function(int, int, Pointer<Void>, int) _internetSetOption;
  7. WindowsProxyManager() {
  8. _initializeFunctions();
  9. }
  10. void _initializeFunctions() {
  11. _internetSetOption = _winInet
  12. .lookup<NativeFunction<Int32 Function(IntPtr, Uint32, Pointer<Void>, Uint32)>>('InternetSetOptionW')
  13. .asFunction();
  14. }
  15. void setSystemProxy(String proxyServer, {String bypassList = ""}) {
  16. final proxyInfo = calloc<INTERNET_PER_CONN_OPTION_LIST>();
  17. proxyInfo.ref.dwSize = sizeOf<INTERNET_PER_CONN_OPTION_LIST>();
  18. proxyInfo.ref.dwOptionCount = 2;
  19. proxyInfo.ref.dwOptionError = 0;
  20. final options = calloc<INTERNET_PER_CONN_OPTION>(2);
  21. // Set proxy server option
  22. options[0].dwOption = INTERNET_OPTION_PER_CONNECTION_OPTION;
  23. options[0].Value.pszValue = proxyServer.toNativeUtf16();
  24. // Set bypass list option
  25. options[1].dwOption = INTERNET_OPTION_PER_CONNECTION_OPTION;
  26. options[1].Value.pszValue = bypassList.toNativeUtf16();
  27. proxyInfo.ref.pOptions = options;
  28. final result = _internetSetOption(
  29. 0,
  30. INTERNET_OPTION_SETTINGS_CHANGED,
  31. proxyInfo.cast<Void>(),
  32. proxyInfo.ref.dwSize,
  33. );
  34. if (result != 0) {
  35. _internetSetOption(0, INTERNET_OPTION_REFRESH, nullptr, 0);
  36. print("系统代理已设置为: $proxyServer");
  37. } else {
  38. print("设置代理失败。");
  39. }
  40. calloc.free(proxyInfo);
  41. calloc.free(options[0].Value.pszValue);
  42. calloc.free(options[1].Value.pszValue);
  43. calloc.free(options);
  44. }
  45. void disableSystemProxy() {
  46. final proxyInfo = calloc<INTERNET_PER_CONN_OPTION_LIST>();
  47. proxyInfo.ref.dwSize = sizeOf<INTERNET_PER_CONN_OPTION_LIST>();
  48. proxyInfo.ref.dwOptionCount = 1;
  49. proxyInfo.ref.dwOptionError = 0;
  50. final options = calloc<INTERNET_PER_CONN_OPTION>(1);
  51. // Disable proxy
  52. options[0].dwOption = INTERNET_OPTION_PER_CONNECTION_OPTION;
  53. options[0].Value.dwValue = 0;
  54. proxyInfo.ref.pOptions = options;
  55. final result = _internetSetOption(
  56. 0,
  57. INTERNET_OPTION_SETTINGS_CHANGED,
  58. proxyInfo.cast<Void>(),
  59. proxyInfo.ref.dwSize,
  60. );
  61. if (result != 0) {
  62. _internetSetOption(0, INTERNET_OPTION_REFRESH, nullptr, 0);
  63. print("系统代理已禁用");
  64. } else {
  65. print("禁用代理失败。");
  66. }
  67. calloc.free(proxyInfo);
  68. calloc.free(options);
  69. }
  70. }
  71. // INTERNET_PER_CONN_OPTION_LIST 结构定义
  72. base class INTERNET_PER_CONN_OPTION_LIST extends Struct {
  73. @Uint32()
  74. external int dwSize;
  75. @IntPtr()
  76. external int pszConnection;
  77. @Uint32()
  78. external int dwOptionCount;
  79. @Uint32()
  80. external int dwOptionError;
  81. external Pointer<INTERNET_PER_CONN_OPTION> pOptions;
  82. }
  83. base class INTERNET_PER_CONN_OPTION extends Struct {
  84. @Uint32()
  85. external int dwOption;
  86. external INTERNET_PER_CONN_OPTION_Union Value;
  87. }
  88. base class INTERNET_PER_CONN_OPTION_Union extends Union {
  89. @Uint32()
  90. external int dwValue;
  91. external Pointer<Utf16> pszValue;
  92. }
  93. // 常量定义
  94. const INTERNET_OPTION_PER_CONNECTION_OPTION = 75;
  95. const INTERNET_OPTION_SETTINGS_CHANGED = 39;
  96. const INTERNET_OPTION_REFRESH = 37;
  97. // void main() {
  98. // if (Platform.isWindows) {
  99. // final proxyManager = WindowsProxyManager();
  100. //
  101. // // 设置系统代理
  102. // proxyManager.setSystemProxy("http=127.0.0.1:8888;https=127.0.0.1:8888", bypassList: "<local>");
  103. //
  104. // // 禁用系统代理
  105. // proxyManager.disableSystemProxy();
  106. // } else {
  107. // print("该代码仅支持 Windows 平台.");
  108. // }
  109. // }