"Чем cmd-шки запускать, лучше прогу написать ", или как я на Flutter-е GUI для goodbyedpi писал.

Или опять обходим замедление YouTube.

Ссылки

Введение

Время, когда для простого просмотра видосиков на ютубе нужно вокруг компьютера нужно потанцевать с бубном и сделать расклад таро на загрузку видео в full hd качестве, настало. Когда то я мог подумать, что для меня это конец света и жизнь моя больше не будет иметь смысла, но для меня это чувство давно ушло, и я даже немного рад, что на такой волне траура я смогу немного поднять с пола свой GitHub(да, очевидно, что для программиста, как и для блогера, это время новых возможностей, разница лишь в том, что пока блогеры чешут языком и собирают просмотры на чьих то программах, показывая одни и те же способы миллиарды раз, а небольшая каста прогеров смогла найти себе занятие - написать удобную программу с GUI для обхода и/или написать backend для нее). Ну так вот, я признаюсь, что хоть я и позиционирую себя больше бэком, чем фронтендером, но в сетевом программировании я ноль без палочки, а вот в последнее время стал интересоваться флаттером. До программы, про которую сейчас пойдет речь, я написал еще Android клиент для анилибрии *ссылка*, кому интересно, посмотрите. В итоге, я решил прикола ради написать графический интерфейс для GoodbyeDPI. О нем как раз и пойдет речь.

Разработка

Так как goodbyedpi только для windows, целевая система стала как раз win64. Так что я просто создал flutter проект и написал простой интерфейс (расписывать, как я это сделал, не буду, кому интересен код, ссылка на гитхаб в начале статьи). Единственное, что отмечу, так это способ запуска / остановки. Все это было реализовано при помощи двух методов и библиотеки 'dart:io':

Future<void> _startProcess() async { _process = await Process.start(pathG, settings[0] ? defaultCommand : settings[1] ? commandWithCustomconfig : command); debugPrint('Process started with ${settings[0] ? defaultCommand : settings[1] ? commandWithCustomconfig : command} arguments'); setState(() {}); } Future<void> _killProcess() async { if (_process != null) { _process!.kill(); _process = null; debugPrint('Process killed'); setState(() {}); } }

Так же хотелось бы посоветовать способ работы с треем, я использовал библиотеку system_tray, а так же для работы с окном использовал window_manager. Window_manager мне больше всего пригодился, чтобы не сразу закрывать программу при нажатии на крестик, а дать возможность свернуть ее в трей методом onWindowClose():

@override void onWindowClose() async { bool _isPreventClose = await windowManager.isPreventClose(); if (_isPreventClose) { showDialog( context: context, builder: (_) { return AlertDialog( title: const Text('Закрыть?'), actions: [ TextButton( child: const Text('В трей'), onPressed: () async { Navigator.of(context).pop(); await windowManager.hide(); }, ), TextButton( child: const Text('Закрыть'), onPressed: () async { Navigator.of(context).pop(); await _killProcess(); await windowManager.hide(); await windowManager.destroy(); }, ), ], ); }, ); } super.onWindowClose(); } @override void onWindowFocus() { setState(() {}); }

И последнее, что скажу в блоке разработка. Чтобы сделать так, чтобы программа на flutter запускалась только с повышенными привилегиями (правами администратора), нужно в файле windows/runner/CMakeLists.txt добавить вот такую строку:

SET_TARGET_PROPERTIES(${BINARY_NAME} PROPERTIES LINK_FLAGS "/MANIFESTUAC:\"level='requireAdministrator' uiAccess='false'\" /SUBSYSTEM:WINDOWS")

На этом переходим к блоку осмотра программы, т.е блок для рядового пользователя.

Обзор программы

Начну с интерфейса. Он интуитивно понятный и современный:

интерфейс программы
интерфейс программы

Интересный факт: программа называется DPIшиканокер в честь Шиканоко, вымышленного персонажа из аниме 'Моя подруга олениха, Нокотан'. Почему? Шиканоко умеет выносить мозги и иногда делает полную чушь, и название символизирует вынос Deep Package Inspection.

Программу можно установить через установщик или использовать портативно (оба варианта можно скачать на гитхабе). После открытия приложения не надо разбираться в кнопочках - просто оставьте использовать лучший конфиг и нажмите запустить, а так же в браузерах на основе chromium отключите TLS 1.3 hybridized Kyber support на странице flags (интернет вам в помощь) - все, goodbyedpi работает, как и ютуб. На этой прекрасной ноте я завершаю статью - больше мне сказать нечего.

Спасибо за уделенное на мою статью время! Удачи!

4545
39 комментариев

Как тебе такое, Илон Маск?

10
Ответить

в самолете кнопок меньше..

10
Ответить

Мне кажется я такой комментарий уже видел... В любом случае, целевая аудитория моей проги были мои друзья и я ориентировался под них, а большинство из них с компом не то что на 'вы', а почти в рабстве, так что для них понять что там написано просто невозможно, в моей же нужно только кнопочку запустить нажать, и по сути все. Так что что кому удобнее, тут дело вкуса.

4
Ответить

Уважаемое дело, полезное

7
Ответить

А зачем ему интерфейс нужен?

2
Ответить

На самом деле, мне он тоже не особо нужен был, просто мне хотелось его в трей сворачивать, а нужен был интерфейс для моих друзей, они сказали полезно

11
Ответить

хз, ведь интерфейс и у оригинала есть

2
Ответить