caeef20df3
ci-pangolin / Lint — shellcheck (push) Has been cancelled
ci-pangolin / Unit Tests — nginx cfg + compose (push) Has been cancelled
ci-pangolin / OpenAPI Sync Check (push) Has been cancelled
ci-pangolin / Redline Scan — 脱敏 (UI 文案) (push) Has been cancelled
ci-pangolin / Flutter — analyze + test (push) Has been cancelled
ci-pangolin / Image Build — pangolin-edge (push) Has been cancelled
Windows 与 macOS 桌面同路线:Flutter 应用 + sing-box.exe 子进程 + wintun TUN
接管整机流量。Dart/桥接层此前已 Windows-ready(kernel_process._buildCommand /
_resolveBinaryPath、desktop_vpn_bridge 配置路径、fetch-desktop-bin.sh),本次补
原生外壳 + 提权 + 打包:
- flutter create --platforms=windows 生成 windows/ runner(flutter_secure_storage
已注册 windows 插件,token 存储可用)。
- runner.exe.manifest 设 requestedExecutionLevel=requireAdministrator:启动 UAC
提权,sing-box 子进程继承管理员权以创建 wintun TUN(与 _buildCommand 既有设计一致)。
- windows/CMakeLists.txt 增 install 规则:打包时把 app/kernel/dist/desktop/windows-*/
{sing-box.exe,wintun.dll} 拷到 app exe 同级目录(存在才拷,缺失告警,类比 android
build.gradle 占位)。
- kernel_process.dart 启动时校验 wintun.dll 与 sing-box.exe 同目录,缺失早警。
- windows/README.md:拉内核二进制 / 管理员终端 flutter run / 打包 / 出网验证步骤。
提权用 requireAdministrator(每次 UAC),正式版可换特权 helper(BACKLOG,类比 SMJobBless)。
本机(macOS)验证:flutter analyze 无 error。Windows 真机 build/连通验证待后续
(无 Windows 机器,状态同 Android/iOS:代码就绪、未真机验证)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
103 lines
3.4 KiB
C++
103 lines
3.4 KiB
C++
#ifndef RUNNER_WIN32_WINDOW_H_
|
|
#define RUNNER_WIN32_WINDOW_H_
|
|
|
|
#include <windows.h>
|
|
|
|
#include <functional>
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
// A class abstraction for a high DPI-aware Win32 Window. Intended to be
|
|
// inherited from by classes that wish to specialize with custom
|
|
// rendering and input handling
|
|
class Win32Window {
|
|
public:
|
|
struct Point {
|
|
unsigned int x;
|
|
unsigned int y;
|
|
Point(unsigned int x, unsigned int y) : x(x), y(y) {}
|
|
};
|
|
|
|
struct Size {
|
|
unsigned int width;
|
|
unsigned int height;
|
|
Size(unsigned int width, unsigned int height)
|
|
: width(width), height(height) {}
|
|
};
|
|
|
|
Win32Window();
|
|
virtual ~Win32Window();
|
|
|
|
// Creates a win32 window with |title| that is positioned and sized using
|
|
// |origin| and |size|. New windows are created on the default monitor. Window
|
|
// sizes are specified to the OS in physical pixels, hence to ensure a
|
|
// consistent size this function will scale the inputted width and height as
|
|
// as appropriate for the default monitor. The window is invisible until
|
|
// |Show| is called. Returns true if the window was created successfully.
|
|
bool Create(const std::wstring& title, const Point& origin, const Size& size);
|
|
|
|
// Show the current window. Returns true if the window was successfully shown.
|
|
bool Show();
|
|
|
|
// Release OS resources associated with window.
|
|
void Destroy();
|
|
|
|
// Inserts |content| into the window tree.
|
|
void SetChildContent(HWND content);
|
|
|
|
// Returns the backing Window handle to enable clients to set icon and other
|
|
// window properties. Returns nullptr if the window has been destroyed.
|
|
HWND GetHandle();
|
|
|
|
// If true, closing this window will quit the application.
|
|
void SetQuitOnClose(bool quit_on_close);
|
|
|
|
// Return a RECT representing the bounds of the current client area.
|
|
RECT GetClientArea();
|
|
|
|
protected:
|
|
// Processes and route salient window messages for mouse handling,
|
|
// size change and DPI. Delegates handling of these to member overloads that
|
|
// inheriting classes can handle.
|
|
virtual LRESULT MessageHandler(HWND window,
|
|
UINT const message,
|
|
WPARAM const wparam,
|
|
LPARAM const lparam) noexcept;
|
|
|
|
// Called when CreateAndShow is called, allowing subclass window-related
|
|
// setup. Subclasses should return false if setup fails.
|
|
virtual bool OnCreate();
|
|
|
|
// Called when Destroy is called.
|
|
virtual void OnDestroy();
|
|
|
|
private:
|
|
friend class WindowClassRegistrar;
|
|
|
|
// OS callback called by message pump. Handles the WM_NCCREATE message which
|
|
// is passed when the non-client area is being created and enables automatic
|
|
// non-client DPI scaling so that the non-client area automatically
|
|
// responds to changes in DPI. All other messages are handled by
|
|
// MessageHandler.
|
|
static LRESULT CALLBACK WndProc(HWND const window,
|
|
UINT const message,
|
|
WPARAM const wparam,
|
|
LPARAM const lparam) noexcept;
|
|
|
|
// Retrieves a class instance pointer for |window|
|
|
static Win32Window* GetThisFromHandle(HWND const window) noexcept;
|
|
|
|
// Update the window frame's theme to match the system theme.
|
|
static void UpdateTheme(HWND const window);
|
|
|
|
bool quit_on_close_ = false;
|
|
|
|
// window handle for top level window.
|
|
HWND window_handle_ = nullptr;
|
|
|
|
// window handle for hosted content.
|
|
HWND child_content_ = nullptr;
|
|
};
|
|
|
|
#endif // RUNNER_WIN32_WINDOW_H_
|