窗口选项
WebviewWindowOptions 完整参考
窗口配置选项
Wails 提供全面的窗口配置,包含数十个用于设置大小、位置、外观和行为的选项。本参考文档是WebviewWindowOptions的完整参考,涵盖 Windows、macOS 和 Linux 上的所有可用选项,并提供每个选项、每个平台的示例和约束。
WebviewWindowOptions 结构
type WebviewWindowOptions struct {
// Identity
Name string
Title string
// Size and Position
Width int
Height int
X int
Y int
MinWidth int
MinHeight int
MaxWidth int
MaxHeight int
InitialPosition WindowStartPosition // WindowCentered (default) or WindowXY
Screen *Screen // target screen for initial placement
// Initial State
Hidden bool
Frameless bool
DisableResize bool // inverted vs v2's `Resizable`
AlwaysOnTop bool
StartState WindowState // WindowStateNormal | Minimised | Maximised | Fullscreen
// Appearance
BackgroundColour RGBA
BackgroundType BackgroundType
Zoom float64
ZoomControlEnabled bool
// Content
URL string
HTML string
JS string
CSS string
// Behaviour
EnableFileDrop bool
IgnoreMouseEvents bool
HideOnFocusLost bool
HideOnEscape bool
DevToolsEnabled bool
DefaultContextMenuDisabled bool
ContentProtectionEnabled bool
KeyBindings map[string]func(window *WebviewWindow)
// Permissions
Permissions map[PermissionType]Permission
// Window-control button states
MinimiseButtonState ButtonState
MaximiseButtonState ButtonState
CloseButtonState ButtonState
// Menu
UseApplicationMenu bool
// Platform-specific (per-window)
Mac MacWindow
Windows WindowsWindow
Linux LinuxWindow
}WebviewWindowOptions没有Parent字段——如需建立父窗口/模态窗口关系,请使用parentWindow.AttachModal(childWindow)。它也没有Assets字段——资源配置位于application.Options(Assets AssetOptions)中。
完整源代码:v3/pkg/application/webview_window_options.go。
核心选项
Name
类型:string 默认值:自动生成的 UUID 平台:全部
Name: "main-window"用途:用于稍后查找窗口的唯一标识符。
最佳实践:
- 使用描述性名称:
"main"、"settings"、"about" - 使用 kebab-case:
"file-browser"、"color-picker" - 名称应简短且易于记忆
示例:
window := app.Window.NewWithOptions(application.WebviewWindowOptions{
Name: "settings-window",
})
// Later...
if settings, ok := app.Window.GetByName("settings-window"); ok {
settings.Focus()
}Title
类型:string 默认值:应用程序名称 平台:全部
Title: "My Application"用途:显示在标题栏和任务栏中的文本。
动态更新:
window.SetTitle("My Application - Document.txt")Width / Height
类型:int(像素) 默认值:800 x 600 平台:全部 约束:必须为正数
Width: 1200,
Height: 800,用途:以逻辑像素指定窗口的初始大小。
注意事项:
- Wails 会自动处理 DPI 缩放
- 使用逻辑像素,而非物理像素
- 考虑最低屏幕分辨率(1024x768)
尺寸示例:
| 使用场景 | 宽度 | 高度 |
|---|---|---|
| 小型实用程序 | 400 | 300 |
| 标准应用程序 | 1024 | 768 |
| 大型应用程序 | 1440 | 900 |
| 全高清 | 1920 | 1080 |
X/Y
类型:int(像素) 默认值:在屏幕上居中 平台:全部
X: 100, // 100px from left edge
Y: 100, // 100px from top edge用途:窗口的初始位置。
坐标系:
- (0、0)是主屏幕的左上角
- X 正方向向右
- Y 正方向向下
示例:
只有设置了InitialPosition: application.WindowXY,X和Y才会生效。否则,InitialPosition默认为WindowCentered,并忽略X/Y。
settings := app.Window.NewWithOptions(application.WebviewWindowOptions{
Name: "coordinate-window",
InitialPosition: application.WindowXY, // opt into X/Y coordinates
X: 100,
Y: 100,
})最佳实践:如果不需要指定具体坐标,请在创建窗口后使用Center()将其居中:
window := app.Window.New()
window.Center()MinWidth / MinHeight
类型:int(像素) 默认值:0(无最小值) 平台:全部
MinWidth: 400,
MinHeight: 300,用途:防止窗口过小。
使用场景:
- 防止布局错乱
- 确保可用性
- 保持宽高比
示例:
// Prevent window smaller than 400x300
MinWidth: 400,
MinHeight: 300,MaxWidth / MaxHeight
类型:int(像素) 默认值:0(无最大值) 平台:全部
MaxWidth: 1920,
MaxHeight: 1080,用途:防止窗口过大。
使用场景:
- 固定大小的应用程序
- 防止资源使用过多
- 保持设计约束
状态选项
Hidden
类型:bool 默认值:false 平台:所有平台
Hidden: true,用途:创建窗口但不显示。
使用场景:
- 后台窗口
- 按需显示的窗口
- 启动画面(创建、加载,然后显示)
- 防止加载内容时出现白屏闪烁
平台改进:
- Windows:已修复窗口白屏闪烁问题——调用
Show()之前,窗口会一直保持不可见 - macOS:完全支持
- Linux:完全支持
实现平滑加载的推荐模式:
// Create hidden window
window := app.Window.NewWithOptions(application.WebviewWindowOptions{
Name: "main-window",
Hidden: true,
BackgroundColour: application.NewRGB(30, 30, 30), // Match your theme
})
// Load content while hidden
// ... content loads ...
// Show when ready (no flash!)
window.Show()示例:
settings := app.Window.NewWithOptions(application.WebviewWindowOptions{
Name: "settings",
Hidden: true,
})
// Show when needed
settings.Show()Frameless
类型:bool 默认值:false 平台:所有平台
Frameless: true,用途:移除标题栏和窗口边框。
使用场景:
- 自定义窗口装饰
- 启动画面
- 自助终端应用
- 采用自定义设计的窗口
重要提示:需要自行实现:
- 窗口拖动
- 关闭、最小化和最大化按钮
- 调整大小手柄(如果窗口可调整大小)
有关详细信息,请参阅无边框窗口。
DisableResize
类型:bool 默认值:false(默认情况下窗口可调整大小) 平台:所有平台
DisableResize: true,用途:阻止调整窗口大小。请注意,此字段与v2的Resizable含义相反——设置DisableResize: true可使窗口无法调整大小。
使用场景:
- 固定尺寸的应用
- 启动画面
- 对话框
注意:除非还通过MaximiseButtonState或集合行为禁用最大化和全屏,否则用户仍可将窗口最大化或切换到全屏。
AlwaysOnTop
类型:bool 默认值:false 平台:所有平台
AlwaysOnTop: true,用途:使窗口保持在所有其他窗口之上。
使用场景:
- 浮动工具栏
- 通知
- 画中画
- 计时器
平台说明:
- macOS:完全支持
- Windows:完全支持
- Linux:取决于窗口管理器
StartState
类型:WindowState枚举 默认值:WindowStateNormal 平台:所有平台
StartState: application.WindowStateMaximised,用途:窗口显示时的初始状态。
可选值:
WindowStateNormal- 普通窗口WindowStateMinimised- 最小化WindowStateMaximised- 最大化WindowStateFullscreen- 全屏
不存在WindowStateHidden常量——要让窗口在启动时不可见,请使用Hidden布尔字段。
在运行时切换全屏模式:
window.Fullscreen()
window.UnFullscreen()
window.ToggleFullscreen() // there is no SetFullscreen(bool)外观选项
BackgroundColour
类型:RGBA结构体 默认值:白色 平台:全部
BackgroundColour: application.RGBA{Red: 0, Green: 0, Blue: 0, Alpha: 255},RGBA字段均为Red, Green, Blue, Alpha(uint8)。建议使用辅助函数application.NewRGB(r, g, b)(alpha 为255)或application.NewRGBA(r, g, b, a)。
用途:内容加载前的窗口背景颜色。
使用场景:
- 与应用的主题保持一致
- 防止使用深色主题时出现白屏闪烁
- 提供流畅的加载体验
示例:
// Dark theme
BackgroundColour: application.NewRGB(30, 30, 30),
// Light theme
BackgroundColour: application.NewRGB(255, 255, 255),辅助方法:
window.SetBackgroundColour(application.NewRGB(30, 30, 30))BackgroundType
类型:BackgroundType枚举 默认值:BackgroundTypeSolid 平台:macOS、Windows(部分支持)
BackgroundType: application.BackgroundTypeTranslucent,取值:
BackgroundTypeSolid- 纯色BackgroundTypeTransparent- 完全透明BackgroundTypeTranslucent- 半透明模糊
平台支持:
- macOS:配置
Mac.Backdrop;要使 WebView 透明,必须设置private_mac_apis。否则,WebView 将保持不透明。 - Windows:支持透明和半透明(Windows 11及更高版本)
- Linux:仅支持纯色
示例(macOS):
BackgroundType: application.BackgroundTypeTranslucent,
Mac: application.MacWindow{
Backdrop: application.MacBackdropTranslucent,
},OpenInspectorOnStartup 和 OpenDevTools
macOS 上的私有 API:OpenInspectorOnStartup: true、Go window.OpenDevTools()和 JavaScript Window.OpenDevTools()需要private_mac_apis才能以编程方式打开检查器。若未设置,这些操作不会产生任何效果。生产构建还需要devtools。macOS 13.3及更高版本上的公开 Safari 检查功能不需要私有 API;在较旧版本的 macOS 上启用检查器则需要。请参阅Web 检查器构建矩阵。
内容选项
URL
类型:string 默认值:空(从 Assets 加载) 平台:全部
URL: "https://example.com",用途:加载外部 URL,而不是嵌入式资源。
使用场景:
- 开发(从开发服务器加载)
- 基于 Web 的应用
- 混合应用
示例:
// Development — point the window at the Vite dev server
URL: "http://localhost:9245",
// Production — embedded assets are configured at the application level
// (Assets is application.Options.Assets, not a WebviewWindowOptions field).生产环境下的应用级代码片段:
app := application.New(application.Options{
Name: "My App",
Assets: application.AssetOptions{
Handler: application.AssetFileServerFS(assets),
},
})HTML
类型:string 默认值:空 平台:全部
HTML: "<h1>Hello World</h1>",用途:直接加载 HTML 字符串。
使用场景:
- 简单窗口
- 生成的内容
- 测试
示例:
HTML: `
<!DOCTYPE html>
<html>
<head><title>Simple Window</title></head>
<body><h1>Hello from Wails!</h1></body>
</html>
`,Assets(仅限应用级)
资源配置不是WebviewWindowOptions字段。前端资源由应用本身通过application.Options.Assets(AssetOptions)提供;每个窗口都继承该资源服务器。
app := application.New(application.Options{
Assets: application.AssetOptions{
Handler: application.AssetFileServerFS(assets),
},
})有关详细信息,请参阅构建系统。
UseApplicationMenu
类型:bool 默认值:false 平台:Windows、Linux(在 macOS 上无效)
UseApplicationMenu: true,用途:为此窗口使用应用菜单(通过app.Menu.Set()设置)。
在macOS上,此选项无效,因为 macOS 始终使用屏幕顶部的全局应用菜单。
在Windows和Linux上,窗口默认不显示菜单。设置UseApplicationMenu: true后,窗口将使用应用级菜单,从而提供一种简单的跨平台解决方案。
示例:
// Set the application menu once
menu := app.NewMenu()
menu.AddRole(application.FileMenu)
menu.AddRole(application.EditMenu)
app.Menu.Set(menu)
// All windows with UseApplicationMenu will display this menu
app.Window.NewWithOptions(application.WebviewWindowOptions{
Title: "Main Window",
UseApplicationMenu: true,
})
app.Window.NewWithOptions(application.WebviewWindowOptions{
Title: "Second Window",
UseApplicationMenu: true, // Also gets the app menu
})注意事项:
- 如果同时设置了
UseApplicationMenu和窗口专用菜单,则窗口专用菜单优先 - 这无需在运行时检查操作系统,从而简化跨平台代码
- 有关菜单的完整文档,请参阅应用菜单
输入选项
EnableFileDrop
类型:bool 默认值:false 平台:所有平台
EnableFileDrop: true,用途:允许将操作系统中的文件拖放到窗口中。
启用后:
- 可以将文件管理器中的文件拖放到应用程序中
- 拖放文件时会触发
WindowFilesDropped事件,并提供被拖放文件的路径 - 带有
data-file-drop-target属性的元素会提供详细的拖放信息
使用场景:
- 文件上传界面
- 文档编辑器
- 媒体导入工具
- 任何接受文件的应用
示例:
window := app.Window.NewWithOptions(application.WebviewWindowOptions{
Title: "File Uploader",
EnableFileDrop: true,
})
// Handle dropped files
window.OnWindowEvent(events.Common.WindowFilesDropped, func(event *application.WindowEvent) {
files := event.Context().DroppedFiles()
details := event.Context().DropTargetDetails()
for _, file := range files {
fmt.Println("Dropped:", file)
}
})HTML 放置区:
<!-- Mark elements as drop targets -->
<div id="upload" data-file-drop-target>
Drop files here
</div>有关完整文档,请参阅文件拖放。
安全选项
ContentProtectionEnabled
类型:bool 默认值:false 平台:Windows(10及更高版本)、macOS
ContentProtectionEnabled: true,用途:防止捕获窗口内容的屏幕画面。
平台支持:
- Windows:Windows 10内部版本19041及更高版本(完全支持),旧版本(部分支持)
- macOS:完全支持
- Linux:不支持
使用场景:
- 银行应用程序
- 密码管理器
- 医疗记录
- 机密文档
重要说明:
- 无法防止使用物理相机拍摄
- 某些工具可能会绕过保护
- 这只是综合安全措施的一部分,不能作为唯一的保护措施
- DevTools 窗口不会自动受到保护
示例:
window := app.Window.NewWithOptions(application.WebviewWindowOptions{
Title: "Secure Window",
ContentProtectionEnabled: true,
})
// Toggle at runtime
window.SetContentProtection(true)权限
类型:map[PermissionType]Permission 默认值:nil(由平台按默认方式处理) 平台:Linux、Windows(macOS 交由 TCC 处理)
Permissions: map[application.PermissionType]application.Permission{
application.PermissionMicrophone: application.PermissionAllow,
application.PermissionCamera: application.PermissionAllow,
},用途:以声明方式控制如何处理窗口中网页内容发出的功能请求(摄像头、麦克风、地理位置、通知和读取剪贴板),无需编写平台专用代码。
PermissionType 值:PermissionMicrophone、PermissionCamera、PermissionGeolocation、PermissionNotifications、PermissionClipboardRead
权限值:
PermissionDefault(0)— 使用平台的原生处理方式:在 macOS/Windows 上显示 OS/WebView2 提示;在 Linux 上,允许使用摄像头和麦克风,拒绝其他所有请求PermissionAllow(1)— 不显示提示,直接授予权限(Linux:仅实现了摄像头和麦克风权限;其他类型仍会被拒绝)PermissionDeny(2)— 不显示提示,直接拒绝权限
重要说明 — Windows:在此选项出现之前,Wails 会静默授予所有 WebView2 功能权限。现在,只要在Permissions中设置任何条目,就会禁用这种一律授予权限的行为。未列出的功能将显示 WebView2 的原生提示,而不会被自动允许。请明确列出应用所需的每项功能。
有关完整指南、平台支持矩阵和示例,请参阅权限。
窗口生命周期事件
使用OnWindowEvent和RegisterHook处理窗口生命周期事件。通过这些方法,可以精细控制窗口关闭和销毁行为。
取消关闭窗口
要阻止窗口关闭(例如存在未保存的更改),请将RegisterHook与WindowClosing事件结合使用,并调用event.Cancel():
window := app.Window.NewWithOptions(application.WebviewWindowOptions{
Name: "main-window",
Title: "My Application",
})
// Register a hook to intercept the closing event
window.RegisterHook(events.Common.WindowClosing, func(event *application.WindowEvent) {
if hasUnsavedChanges() {
// Ask user for confirmation
result := showConfirmDialog("Unsaved changes. Close anyway?")
if result != "yes" {
// Cancel the close event
event.Cancel()
}
}
})要点:
RegisterHook在事件发生前将其拦截- 调用
event.Cancel()可阻止窗口关闭 - 取消关闭后,窗口将保持打开
处理窗口关闭
要在窗口关闭时执行清理,请将OnWindowEvent与WindowClosing事件结合使用:
window.OnWindowEvent(events.Common.WindowClosing, func(event *application.WindowEvent) {
// Cleanup code runs here
fmt.Printf("Window %s is closing\n", window.Name())
// Close database connection
if db != nil {
db.Close()
}
// Remove from window list
removeWindow(window.ID())
})要点:
OnWindowEvent处理即将发生的事件- 清理操作在窗口销毁前运行
- 无法在此处取消关闭(请使用
RegisterHook)
单例窗口清理模式
对于单例窗口(确保仅有一个实例),请使用WindowClosing清理引用:
var settingsWindow *application.WebviewWindow
func ShowSettings(app *application.App) {
// Create if doesn't exist
if settingsWindow == nil {
settingsWindow = app.Window.NewWithOptions(application.WebviewWindowOptions{
Name: "settings",
Title: "Settings",
Width: 600,
Height: 400,
})
// Cleanup on close
settingsWindow.OnWindowEvent(events.Common.WindowClosing, func(event *application.WindowEvent) {
settingsWindow = nil
})
}
// Show and focus
settingsWindow.Show()
settingsWindow.Focus()
}平台特定选项
Mac 选项
Mac: application.MacWindow{
TitleBar: application.MacTitleBar{
AppearsTransparent: true,
Hide: false,
HideTitle: true,
FullSizeContent: true,
},
Backdrop: application.MacBackdropTranslucent,
InvisibleTitleBarHeight: 50,
WindowClass: application.MacWindowClassPanel,
PanelPreferences: application.MacPanelPreferences{
NonActivating: true,
FloatingPanel: true,
BecomesKeyOnlyIfNeeded: false,
UtilityWindow: false,
},
WindowLevel: application.MacWindowLevelFloating,
CollectionBehavior: application.MacWindowCollectionBehaviorDefault,
TabbingMode: application.MacWindowTabbingModeDisallowed,
},TitleBar(MacTitleBar)
AppearsTransparent- 将标题栏设为透明,内容延伸至标题栏区域Hide- 完全隐藏标题栏HideTitle- 仅隐藏标题文本FullSizeContent- 将内容延伸至整个窗口
在 macOS 上,WebView 透明效果和通过编程方式打开检查器需要private_mac_apis构建标签。没有该标签时,这些选项仍然有效,但仅限私有 API 的操作不会产生任何效果。Liquid Glass 分组也会被忽略,样式则使用公开的替代方案。有关构建命令和确切行为,请参阅私有 macOS API。
Backdrop(MacBackdrop)
MacBackdropNormal- 标准不透明背景MacBackdropTranslucent- WebView 透明效果需要私有 API。没有该标签时,原生模糊效果仍位于不透明的 WebView 后方。MacBackdropTransparent- WebView 透明效果需要私有 API。没有该标签时,WebView 仍为不透明。MacBackdropLiquidGlass- WebView 透明效果需要私有 API。没有该标签时,玻璃效果层仍位于不透明的 WebView 后方;样式则使用公开的替代方案。
LiquidGlass(MacLiquidGlass)
| 字段或值 | 在 macOS 上对私有 API 的依赖 |
|---|---|
Style: LiquidGlassStyleAutomatic |
原生常规样式是公开的;背景效果的 WebView 透明效果需要private_mac_apis。 |
Style: LiquidGlassStyleLight |
该标签会保留现有的原生透明样式映射;没有该标签时,Wails 使用采用 Aqua 外观的常规玻璃效果。 |
Style: LiquidGlassStyleDark |
私有 API:未公开的原生样式值2;没有该标签时,使用采用 Dark Aqua 外观的常规玻璃效果。 |
Style: LiquidGlassStyleVibrant |
原生透明样式映射是公开的;背景效果的 WebView 透明效果需要该标签。 |
GroupID |
私有 API:非空值会请求分组;没有该标签时将被忽略。 |
GroupSpacing |
私有 API:正值会请求设置组间距;没有该标签时将被忽略。 |
Material、CornerRadius、TintColor |
它们本身不依赖私有 API。 |
有关原生样式值和操作系统可用性,请参阅Liquid Glass 值。
InvisibleTitleBarHeight(int)
- 不可见标题栏区域的高度(用于拖动)
- 仅当原生标题栏拖动区域被隐藏时生效,即窗口无边框(
Frameless: true)或使用透明标题栏(AppearsTransparent: true)时 - 对标题栏可见的标准窗口无效
WindowClass(MacWindowClass)
MacWindowClassWindow- 标准NSWindow行为(默认)MacWindowClassPanel- 一种永远不会成为应用程序主窗口的辅助NSPanel
PanelPreferences仅适用于MacWindowClassPanel:
NonActivating会添加NSWindowStyleMaskNonactivatingPanel。显示面板或使其获得焦点不会激活 Wails 应用程序,但面板仍可成为按键窗口,以便操作控件和输入文本。FloatingPanel会启用 AppKit 的浮动面板行为。- 仅当所点击的视图请求键盘输入时,
BecomesKeyOnlyIfNeeded才会获得按键窗口状态。 UtilityWindow会应用原生实用工具窗口样式。
Wails 面板在应用程序停用时仍保持可见,并在关闭时释放,这与WebviewWindow预期的生命周期一致。这些设置有意覆盖NSPanel中相反的默认值。
窗口类、窗口层级、激活策略和集合行为分别解决不同的问题:
WindowClass用于选择NSWindow或NSPanel,并控制主窗口和按键窗口的语义。WindowLevel控制 Z 轴顺序。对于菜单栏覆盖层,请使用MacWindowLevelPopUpMenu。MacOptions.ActivationPolicy控制整个应用程序,包括 Dock 和菜单栏的呈现方式。非激活面板不需要辅助应用激活策略,但应用仍可使用该策略隐藏其 Dock 图标。CollectionBehavior控制窗口是否参与 Spaces 和全屏模式。
// Spotlight/menu-bar panel that leaves the current application active.
Mac: application.MacWindow{
WindowClass: application.MacWindowClassPanel,
PanelPreferences: application.MacPanelPreferences{
NonActivating: true,
},
WindowLevel: application.MacWindowLevelPopUpMenu,
CollectionBehavior: application.MacWindowCollectionBehaviorCanJoinAllSpaces |
application.MacWindowCollectionBehaviorFullScreenAuxiliary |
application.MacWindowCollectionBehaviorStationary,
},WindowLevel(MacWindowLevel)
MacWindowLevelNormal- 标准窗口层级(默认)MacWindowLevelFloating- 浮动于普通窗口上方MacWindowLevelTornOffMenu- 分离式菜单层级MacWindowLevelModalPanel- 模态面板层级MacWindowLevelMainMenu- 主菜单层级MacWindowLevelStatus- 状态窗口层级MacWindowLevelPopUpMenu- 弹出式菜单层级MacWindowLevelScreenSaver- 屏幕保护程序层级
显式设置的WindowLevel优先于AlwaysOnTop和PanelPreferences.FloatingPanel。如果未显式设置层级,则AlwaysOnTop或浮动面板会解析为MacWindowLevelFloating;否则,层级为MacWindowLevelNormal。此后调用SetAlwaysOnTop仍属于显式的运行时更改。
CollectionBehavior(MacWindowCollectionBehavior)
控制窗口在 macOS Spaces 和全屏模式下的行为。这些值是位掩码,可以使用按位或(|)组合。
Space 行为:
MacWindowCollectionBehaviorDefault- 使用 FullScreenPrimary(默认,向后兼容)MacWindowCollectionBehaviorCanJoinAllSpaces- 窗口显示在所有 Space 上MacWindowCollectionBehaviorMoveToActiveSpace- 显示时移至当前活动的 SpaceMacWindowCollectionBehaviorManaged- 默认的托管窗口行为MacWindowCollectionBehaviorTransient- 临时/瞬态窗口MacWindowCollectionBehaviorStationary- 切换 Space 时保持原位
窗口循环切换:
MacWindowCollectionBehaviorParticipatesInCycle- 包含在 Cmd+` 循环切换中MacWindowCollectionBehaviorIgnoresCycle- 不包含在 Cmd+` 循环切换中
全屏行为:
MacWindowCollectionBehaviorFullScreenPrimary- 可以进入全屏模式MacWindowCollectionBehaviorFullScreenAuxiliary- 可以覆盖全屏应用MacWindowCollectionBehaviorFullScreenNone- 禁用全屏功能MacWindowCollectionBehaviorFullScreenAllowsTiling- 允许并排平铺(macOS 10.11+)MacWindowCollectionBehaviorFullScreenDisallowsTiling- 阻止平铺(macOS 10.11+)
示例 - 类似 Spotlight 的窗口:
// Window that appears on all Spaces AND can overlay fullscreen apps
Mac: application.MacWindow{
WindowClass: application.MacWindowClassPanel,
PanelPreferences: application.MacPanelPreferences{
NonActivating: true,
},
CollectionBehavior: application.MacWindowCollectionBehaviorCanJoinAllSpaces |
application.MacWindowCollectionBehaviorFullScreenAuxiliary,
WindowLevel: application.MacWindowLevelFloating,
},示例 - 单一行为:
// Window that can appear over fullscreen applications
Mac: application.MacWindow{
CollectionBehavior: application.MacWindowCollectionBehaviorFullScreenAuxiliary,
},TabbingMode(MacWindowTabbingMode)
控制 macOS 10.12及更高版本上的窗口标签页行为。窗口标签页功能可将多个窗口组合为标签页。
选项:
MacWindowTabbingModeDefault- 零值哨兵(未显式设置)。运行时默认为禁止使用标签页MacWindowTabbingModeAutomatic- 由系统决定标签页行为MacWindowTabbingModePreferred- 窗口倾向于使用标签页模式MacWindowTabbingModeDisallowed- 禁用窗口标签页功能
示例 - 禁用窗口标签页功能:
Mac: application.MacWindow{
TabbingMode: application.MacWindowTabbingModeDisallowed,
},示例 - 优先使用窗口标签页:
Mac: application.MacWindow{
TabbingMode: application.MacWindowTabbingModePreferred,
},WebviewPreferences(MacWebviewPreferences)
精细控制底层WKWebView配置。所有字段均为可选;未设置的字段不会改变 WebKit 的默认值。
Mac: application.MacWindow{
WebviewPreferences: application.MacWebviewPreferences{
TabFocusesLinks: optional.True,
TextInteractionEnabled: optional.True,
FullscreenEnabled: optional.False,
AllowsBackForwardNavigationGestures: optional.False,
AllowsMagnification: optional.True,
AllowsAirPlayForMediaPlayback: optional.True,
JavaScriptCanOpenWindowsAutomatically: optional.False,
MinimumFontSize: optional.NewVar(12.0),
ApplicationNameForUserAgent: "MyApp",
EnableAutoplayWithoutUserAction: optional.True,
},
},TabFocusesLinks— 当设为true时,按 Tab 键会将焦点移至链接和表单控件(默认值:false)TextInteractionEnabled— 当设为true时,用户可以选择网页视图中的文本并与其交互(默认值:true)FullscreenEnabled— 当设为true时,网页内容可以通过 HTML Fullscreen API 进入全屏模式(默认值:false)。需要 macOS 12.3 或更高版本。AllowsBackForwardNavigationGestures— 当设为true时,水平轻扫手势会触发后退/前进导航(默认值:false)AllowsMagnification— 当设为true时,网页视图将启用双指缩放(默认值:false)AllowsAirPlayForMediaPlayback— 当设为true时,可以将媒体流式传输到 AirPlay 设备(默认值:true)JavaScriptCanOpenWindowsAutomatically— 当设为true时,JavaScript 无需用户手势即可打开新窗口(默认值:false)MinimumFontSize— 以点为单位的最小字体大小。使用optional.NewVar(12.0)进行设置。未设置时保留 WebKit 默认值。ApplicationNameForUserAgent— 覆盖 WebKit 用户代理字符串中的应用程序名称后缀。当网站拒绝默认的"wails.io"标识符时(例如 YouTube 嵌入内容),此选项很有用。留空则保留默认值。EnableAutoplayWithoutUserAction— 当设为true时,音频和视频无需用户手势即可自动播放。映射到WKWebViewConfiguration.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone(默认值:false)
Windows 选项(每个窗口)
每个窗口使用的结构体是application.WindowsWindow,不是WindowsOptions(后者是应用程序级结构体)。
Windows: application.WindowsWindow{
DisableIcon: false,
DisableMenu: false,
BackdropType: application.Auto,
CustomTheme: application.ThemeSettings{},
DisableFramelessWindowDecorations: false,
NonClientRegionSupport: false,
WebView2CompositionHosting: false,
},DisableIcon(bool)
- 从标题栏中移除图标。
DisableMenu(bool)
- 禁用窗口的菜单栏。当设为
true时,即使已配置菜单栏,窗口也不会显示它。 - 默认值:
false
BackdropType(BackdropType)
application.Auto— 系统默认值application.None— 无背景材质application.Mica— Mica 材质(Windows 11)application.Acrylic— Acrylic 材质(Windows 11)application.Tabbed— Tabbed 材质(Windows 11)
没有WindowsBackdropTypeMica样式的常量,请使用application.Mica等。
CustomTheme(ThemeSettings)
- 值(不是指针)。为窗口边框、标题栏文本和背景以及菜单栏自定义深色/浅色模式颜色。
DisableFramelessWindowDecorations(bool)
- 禁用默认的无边框窗口装饰(Aero 阴影、圆角)。
NonClientRegionSupport(bool)
- 为无边框自定义标题栏启用 WebView2 原生的
app-region: drag/app-region: no-drag支持。 - 此选项仅用于简单的原生应用拖动。它不为自定义标题按钮提供原生行为,也不为自定义最大化按钮提供 Windows 11 Snap Assist / Snap Layouts。
WebView2CompositionHosting(bool)
- 为具有原生 Windows 行为的自定义标题按钮启用由 Wails 管理的
--wails-non-client-region支持,包括自定义最大化按钮上的 Windows 11 Snap Assist / Snap Layouts。 - 实验性功能。此选项通过
ICoreWebView2CompositionController和 DirectComposition 托管 WebView2,而不是使用默认的 HWND 托管控制器。 - 当窗口同时需要 WebView2 原生的
app-region支持和由 Wails 管理的自定义标题按钮区域时,可以将其与NonClientRegionSupport结合使用。
示例:
Windows: application.WindowsWindow{
BackdropType: application.Mica,
DisableIcon: true,
},示例 — 自定义 Windows 标题栏区域:
Windows: application.WindowsWindow{
NonClientRegionSupport: true,
WebView2CompositionHosting: true,
},有关详细行为、权衡以及配套 CSS,请参阅无边框窗口。
Linux 选项(每个窗口)
每个窗口使用的结构体是application.LinuxWindow,不是LinuxOptions。
Linux: application.LinuxWindow{
Icon: []byte{/* PNG data */},
WindowIsTranslucent: false,
},Icon([]byte)
- 窗口图标(PNG 格式)。
WindowIsTranslucent(bool)
- 需要合成器支持。
示例:
//go:embed icon.png
var icon []byte
Linux: application.LinuxWindow{
Icon: icon,
},应用级 Windows 选项
某些 Windows 专用选项必须在应用级而非逐窗口配置。这是因为对于每个用户数据路径,WebView2 仅共享一个浏览器环境。
浏览器标志
WebView2 浏览器标志用于控制应用中所有窗口的实验性功能和行为。必须在application.Options.Windows中设置这些标志:
app := application.New(application.Options{
Name: "My App",
Windows: application.WindowsOptions{
// Enable experimental WebView2 features
EnabledFeatures: []string{
"msWebView2EnableDraggableRegions",
},
// Disable specific features
DisabledFeatures: []string{
"msSmartScreenProtection", // Always disabled by Wails
},
// Additional Chromium command-line arguments
AdditionalBrowserArgs: []string{
"--disable-gpu",
"--remote-debugging-port=9222",
},
},
})EnabledFeatures([]string)
- 要启用的 WebView2 功能标志列表
- 有关可用标志,请参阅WebView2 浏览器标志
- 示例:
"msWebView2EnableDraggableRegions"
DisabledFeatures([]string)
- 要禁用的 WebView2 功能标志列表
- Wails 会自动禁用
msSmartScreenProtection - 示例:
"msExperimentalFeature"
AdditionalBrowserArgs([]string)
- 传递给浏览器进程的 Chromium 命令行参数
- 必须包含
--前缀(例如"--remote-debugging-port=9222") - 有关可用参数,请参阅Chromium 命令行开关
完整示例:
package main
import (
"github.com/wailsapp/wails/v3/pkg/application"
)
func main() {
app := application.New(application.Options{
Name: "My App",
Windows: application.WindowsOptions{
// Enable draggable regions feature
EnabledFeatures: []string{
"msWebView2EnableDraggableRegions",
},
// Enable remote debugging
AdditionalBrowserArgs: []string{
"--remote-debugging-port=9222",
},
},
})
// All windows will use the browser flags configured above
window := app.Window.NewWithOptions(application.WebviewWindowOptions{
Title: "Main Window",
Width: 1024,
Height: 768,
})
window.Show()
app.Run()
}完整示例
下面是一份可用于生产环境的窗口配置:
package main
import (
_ "embed"
"github.com/wailsapp/wails/v3/pkg/application"
)
//go:embed frontend/dist
var assets embed.FS
//go:embed icon.png
var icon []byte
func main() {
app := application.New(application.Options{
Name: "My Application",
})
window := app.Window.NewWithOptions(application.WebviewWindowOptions{
// Identity
Name: "main-window",
Title: "My Application",
// Size and Position
Width: 1200,
Height: 800,
MinWidth: 800,
MinHeight: 600,
// Initial State
StartState: application.WindowStateNormal,
// Appearance
BackgroundColour: application.NewRGB(255, 255, 255),
// Platform-Specific (per-window structs)
Mac: application.MacWindow{
TitleBar: application.MacTitleBar{
AppearsTransparent: true,
},
Backdrop: application.MacBackdropTranslucent,
},
Windows: application.WindowsWindow{
BackdropType: application.Mica,
DisableIcon: false,
},
Linux: application.LinuxWindow{
Icon: icon,
},
})
window.Center()
window.Show()
app.Run()
}前端资源在应用级(application.Options.Assets)提供,而不是逐窗口提供。