AutoHotkey多显示器管理完全指南:从基础到高级应用
一、认知基础:多显示器系统的底层逻辑
在开始使用AutoHotkey管理多显示器之前,我们需要先理解Windows系统如何处理多个显示器。Windows将所有显示器组合成一个虚拟桌面,每个显示器在这个虚拟空间中占据特定的位置和区域。这种统一的坐标系统是实现跨屏幕窗口管理的基础。
显示器信息获取的核心方法
AutoHotkey提供了两种主要方式来获取显示器信息:
-
系统变量直接获取
- A_ScreenWidth/A_ScreenHeight:返回主显示器的分辨率
- A_ScreenDPI:获取主显示器的DPI设置
; 显示主显示器基本信息 MsgBox, 主显示器分辨率: %A_ScreenWidth%×%A_ScreenHeight%`nDPI: %A_ScreenDPI%📌 人话翻译:这些变量就像尺子,能直接告诉你主显示器的"大小"和"清晰度"。
-
SysGet命令高级查询 对于多显示器系统,我们需要使用SysGet命令获取更详细的信息:
; 获取显示器总数 SysGet, MonitorCount, MonitorCount ; 获取主显示器信息 SysGet, PrimaryMonitor, MonitorPrimary ; 获取特定显示器信息(以第2个显示器为例) SysGet, Monitor2, Monitor, 2 ; 显示显示器信息 MsgBox, 显示器总数: %MonitorCount%`n主显示器: %PrimaryMonitorLeft%-%PrimaryMonitorRight%`n第二显示器: %Monitor2Left%-%Monitor2Right%📌 人话翻译:SysGet就像一个系统侦探,可以帮你找出所有显示器的具体位置和尺寸,让你知道每个显示器在虚拟桌面上的"坐标范围"。
实际应用场景
- 系统信息诊断:快速了解当前显示器配置,为远程协助提供基础信息
- 脚本适应性:让你的脚本在不同显示器配置的电脑上都能正常工作
- 多显示器环境检测:根据连接的显示器数量自动调整脚本行为
二、核心功能:窗口定位与移动的实现
掌握窗口定位是多显示器管理的核心技能。AutoHotkey提供了强大的窗口操作命令,让你可以精确控制窗口在各个显示器上的位置和大小。
窗口基本操作命令
-
WinGetPos:获取窗口当前位置和大小
; 获取活动窗口位置和大小 WinGetPos, xPos, yPos, width, height, A MsgBox, 窗口位置: X=%xPos% Y=%yPos%`n窗口大小: %width%×%height% -
WinMove:移动窗口到指定位置并设置大小
; 将活动窗口移动到第二个显示器中央 SysGet, Monitor2, Monitor, 2 ; 计算中央位置 winWidth := 800 winHeight := 600 xPos := Monitor2Left + (Monitor2Right - Monitor2Left - winWidth) / 2 yPos := Monitor2Top + (Monitor2Bottom - Monitor2Top - winHeight) / 2 ; 移动窗口 WinMove, A,, xPos, yPos, winWidth, winHeight📌 人话翻译:这就像给窗口装了个GPS导航,你可以精确指定它应该出现在哪个显示器的哪个位置。
多显示器坐标系统详解
理解AutoHotkey的坐标系统是实现精准窗口控制的关键:
- 坐标原点:主显示器的左上角为(0, 0)
- 水平坐标:向右为正方向,扩展显示器如果在主显示器右侧,其Left值为正
- 垂直坐标:向下为正方向,扩展显示器如果在主显示器下方,其Top值为正
- 负坐标:如果显示器在主显示器左侧或上方,会出现负坐标值
; 显示所有显示器的坐标范围
Loop, %MonitorCount% {
SysGet, Monitor, Monitor, %A_Index%
List .= "显示器 " A_Index ": X=" MonitorLeft "-" MonitorRight " Y=" MonitorTop "-" MonitorBottom "`n"
}
MsgBox, %List%
实际应用场景
- 窗口快速布局:一键将常用窗口排列在指定显示器的特定位置
- 应用启动位置:让不同应用程序启动时自动出现在预设的显示器上
- 屏幕录制区域设置:精确控制录制区域在特定显示器上
三、实战案例:多显示器窗口管理脚本
以下是几个实用的多显示器管理脚本,你可以直接复制使用或根据需求修改。
案例1:窗口快速分发到不同显示器
这个脚本可以将当前活动窗口快速发送到指定显示器,并可选择最大化:
; 窗口分发到不同显示器的快捷键
; Win+Alt+1/2/3 将窗口发送到第1/2/3个显示器
; 按住Shift键同时按下快捷键可最大化窗口
!#1::MoveWindowToMonitor(1)
!#2::MoveWindowToMonitor(2)
!#3::MoveWindowToMonitor(3)
MoveWindowToMonitor(monitorNumber) {
; 获取显示器总数
SysGet, MonitorCount, MonitorCount
; 检查显示器编号是否有效
if (monitorNumber < 1 || monitorNumber > MonitorCount) {
MsgBox, 无效的显示器编号: %monitorNumber%`n系统共有 %MonitorCount% 个显示器
return
}
; 获取目标显示器信息
SysGet, Monitor, Monitor, %monitorNumber%
; 获取是否按下Shift键(用于最大化)
ShiftState := GetKeyState("Shift", "P")
; 获取当前窗口信息
WinGet, activeID, ID, A
; 移动窗口到目标显示器左上角
WinMove, ahk_id %activeID%,, MonitorLeft, MonitorTop
; 如果按下Shift键,最大化窗口
if (ShiftState) {
WinMaximize, ahk_id %activeID%
} else {
; 否则设置为显示器1/4大小并居中
winWidth := (MonitorRight - MonitorLeft) / 2
winHeight := (MonitorBottom - MonitorTop) / 2
xPos := MonitorLeft + (MonitorRight - MonitorLeft - winWidth) / 2
yPos := MonitorTop + (MonitorBottom - MonitorTop - winHeight) / 2
WinMove, ahk_id %activeID%,, xPos, yPos, winWidth, winHeight
}
}
案例2:多显示器工作区切换
这个脚本允许你为不同的工作场景保存和恢复窗口布局:
; 多显示器工作区切换
; Ctrl+Shift+S: 保存当前窗口布局
; Ctrl+Shift+L: 加载保存的窗口布局
; Ctrl+Shift+D: 删除保存的布局
; 布局保存路径
layoutFile := A_ScriptDir "\window_layout.ini"
^+s::
; 保存当前窗口布局
WinGet, winList, List
FileDelete, %layoutFile%
Loop, %winList% {
; 获取窗口ID
winID := winList%A_Index%
; 跳过最小化窗口
WinGet, MinMax, MinMax, ahk_id %winID%
if (MinMax = -1)
continue
; 获取窗口标题
WinGetTitle, Title, ahk_id %winID%
if (Title = "")
continue
; 获取窗口位置和大小
WinGetPos, x, y, w, h, ahk_id %winID%
; 保存到文件
IniWrite, %x%|%y%|%w%|%h%|%MinMax%, %layoutFile%, Windows, %Title%
}
MsgBox, 已保存 %A_Index-1% 个窗口布局
return
^+l::
; 加载保存的窗口布局
if !FileExist(layoutFile) {
MsgBox, 未找到保存的布局文件
return
}
IniRead, winTitles, %layoutFile%, Windows
Loop, parse, winTitles, `n, `r {
if (A_LoopField = "")
continue
; 读取窗口信息
IniRead, winData, %layoutFile%, Windows, %A_LoopField%
StringSplit, data, winData, |
; 移动并调整窗口
WinMove, %A_LoopField%,, data1, data2, data3, data4
; 恢复最大化状态
if (data5 = 1)
WinMaximize, %A_LoopField%
}
MsgBox, 已恢复窗口布局
return
^+d::
; 删除保存的布局
if FileExist(layoutFile) {
FileDelete, %layoutFile%
MsgBox, 已删除保存的布局文件
} else {
MsgBox, 没有可删除的布局文件
}
return
四、进阶技巧:多显示器环境的高级应用
技巧1:动态显示器配置检测
Windows系统在检测到显示器连接或断开时会发送WM_DISPLAYCHANGE消息(0x7E)。我们可以监听这个消息来自动调整窗口布局:
; 监听显示器变化事件
OnMessage(0x7E, "OnDisplayChange")
; 显示器变化处理函数
OnDisplayChange() {
; 等待1秒让系统完成显示器配置
Sleep, 1000
; 重新检测显示器数量
SysGet, NewMonitorCount, MonitorCount
; 可以在这里添加布局调整逻辑
MsgBox, 显示器配置已更改`n当前显示器数量: %NewMonitorCount%
; 例如:如果显示器数量变为1,自动最大化所有窗口
if (NewMonitorCount = 1) {
WinGet, winList, List
Loop, %winList% {
WinMaximize, ahk_id %winList%A_Index%
}
}
}
技巧2:基于显示器的应用启动器
根据显示器配置自动启动不同应用程序:
; 根据显示器数量自动启动应用
StartupApplicationsBasedOnMonitors() {
; 获取显示器数量
SysGet, MonitorCount, MonitorCount
; 启动基础应用(所有配置都需要的)
Run, notepad.exe
Run, chrome.exe
; 根据显示器数量启动额外应用
if (MonitorCount >= 2) {
; 第二显示器启动通讯应用
Run, slack.exe
Run, teams.exe
}
if (MonitorCount >= 3) {
; 第三显示器启动监控工具
Run, taskmgr.exe
Run, resource-monitor.exe
}
}
; 脚本启动时执行
StartupApplicationsBasedOnMonitors()
技巧3:多显示器虚拟桌面管理
结合Windows虚拟桌面功能,为不同显示器创建独立的虚拟桌面环境:
; 多显示器虚拟桌面切换
; Win+Ctrl+Alt+Left/Right 在当前显示器切换虚拟桌面
!^#Left::
!^#Right::
; 获取按键方向
direction := (A_ThisHotkey = "!^#Right") ? 1 : -1
; 获取当前活动窗口所在显示器
WinGetPos, xPos,,, A
currentMonitor := GetMonitorFromPosition(xPos, 0)
; 切换虚拟桌面(需要Windows 10/11支持)
; 这里使用了虚拟桌面API,需要额外的DLL调用
; 完整实现需要ComObjCreate等高级操作
MsgBox, 在显示器 %currentMonitor% 上切换虚拟桌面(方向: %direction%)
return
; 根据坐标获取显示器编号
GetMonitorFromPosition(x, y) {
SysGet, MonitorCount, MonitorCount
Loop, %MonitorCount% {
SysGet, Monitor, Monitor, %A_Index%
if (x >= MonitorLeft && x < MonitorRight && y >= MonitorTop && y < MonitorBottom) {
return A_Index
}
}
return 1 ; 默认返回主显示器
}
五、场景拓展:多显示器的创新应用
场景1:多显示器协作工作区
为远程协作创建专用的多显示器布局,提高团队沟通效率:
; 远程协作工作区设置
SetupCollaborationWorkspace() {
; 主显示器:文档编辑
Run, winword.exe "C:\Projects\会议纪要.docx"
WinWait, 会议纪要
WinMove, 会议纪要,, 0, 0, A_ScreenWidth, A_ScreenHeight/2
; 第二显示器:视频会议
Run, zoom.exe
WinWait, Zoom
SysGet, Monitor2, Monitor, 2
WinMove, Zoom,, Monitor2Left, Monitor2Top, Monitor2Right-Monitor2Left, Monitor2Bottom-Monitor2Top
; 第三显示器(如果存在):项目管理工具
SysGet, MonitorCount, MonitorCount
if (MonitorCount >= 3) {
Run, microsoft-edge:https://teams.microsoft.com
WinWait, Microsoft Teams
SysGet, Monitor3, Monitor, 3
WinMove, Microsoft Teams,, Monitor3Left, Monitor3Top, Monitor3Right-Monitor3Left, Monitor3Bottom-Monitor3Top
}
}
; 设置快捷键启动协作工作区
^!c::SetupCollaborationWorkspace()
场景2:多显示器内容创作环境
为视频编辑或图形设计创建优化的多显示器布局:
; 内容创作工作区设置
SetupCreativeWorkspace() {
; 主显示器:主编辑窗口
Run, adobe premiere pro.exe
WinWait, Adobe Premiere Pro
WinMaximize, Adobe Premiere Pro
; 第二显示器:素材库和时间线
Run, explorer.exe "C:\素材库"
WinWait, 素材库
SysGet, Monitor2, Monitor, 2
; 上半部分:素材库
WinMove, 素材库,, Monitor2Left, Monitor2Top, Monitor2Right-Monitor2Left, (Monitor2Bottom-Monitor2Top)/2
; 下半部分:调色面板
Run, adobe speedgrade.exe
WinWait, SpeedGrade
WinMove, SpeedGrade,, Monitor2Left, Monitor2Top + (Monitor2Bottom-Monitor2Top)/2, Monitor2Right-Monitor2Left, (Monitor2Bottom-Monitor2Top)/2
}
; 设置快捷键启动创作工作区
^!v::SetupCreativeWorkspace()
场景3:多显示器游戏辅助系统
为游戏玩家创建多显示器辅助界面:
; 游戏多显示器辅助系统
#IfWinActive, 游戏窗口标题
; F12 显示/隐藏游戏辅助面板
F12::
ToggleGamePanel()
return
#IfWinActive
ToggleGamePanel() {
; 检查面板是否存在
IfWinExist, 游戏辅助面板
{
WinHide, 游戏辅助面板
return
}
; 创建辅助面板(在第二显示器)
SysGet, Monitor2, Monitor, 2
Gui +LastFound +AlwaysOnTop -Caption +ToolWindow
Gui, Color, 000000
Gui, Add, Text, cWhite, 游戏状态面板
Gui, Add, Text, cWhite vFPS, FPS: --
Gui, Add, Text, cWhite vPing, Ping: --ms
Gui, Show, x%Monitor2Left% y%Monitor2Top% w200 h100 NoActivate, 游戏辅助面板
; 启动监控线程
SetTimer, UpdateGameStats, 1000
}
UpdateGameStats() {
; 这里可以添加获取游戏数据的代码
; 实际应用中需要使用内存读取或API调用来获取游戏数据
Random, fps, 50, 120
Random, ping, 10, 80
GuiControl,, FPS, FPS: %fps%
GuiControl,, Ping, Ping: %ping%ms
}
六、常见误区解析
误区1:忽视显示器编号的动态变化
问题:假设显示器编号固定不变,导致脚本在显示器连接顺序变化后失效。
解决方案:不依赖固定的显示器编号,而是根据位置或分辨率识别显示器:
; 根据分辨率识别主显示器
FindPrimaryMonitorByResolution() {
SysGet, MonitorCount, MonitorCount
Loop, %MonitorCount% {
SysGet, Monitor, Monitor, %A_Index%
width := MonitorRight - MonitorLeft
height := MonitorBottom - MonitorTop
; 假设主显示器分辨率最高
if (width * height > maxArea) {
maxArea := width * height
primaryMonitor := A_Index
}
}
return primaryMonitor
}
误区2:使用绝对坐标而非相对坐标
问题:使用固定像素值定位窗口,导致在不同分辨率显示器上布局错乱。
解决方案:使用相对坐标计算:
; 错误方式:使用固定坐标
WinMove, 窗口标题,, 1920, 0 ; 假设第二显示器在右侧,分辨率1920x1080
; 正确方式:使用相对坐标
SysGet, Monitor2, Monitor, 2
WinMove, 窗口标题,, Monitor2Left, Monitor2Top ; 使用显示器边界作为参考点
误区3:频繁调用系统命令导致性能问题
问题:在循环或频繁触发的热键中反复调用SysGet等系统命令,导致脚本卡顿。
解决方案:缓存显示器信息,定期更新:
; 缓存显示器信息
MonitorCache := {}
; 初始化缓存
UpdateMonitorCache() {
global MonitorCache
MonitorCache := {}
SysGet, MonitorCount, MonitorCount
MonitorCache.Count := MonitorCount
Loop, %MonitorCount% {
SysGet, Monitor, Monitor, %A_Index%
MonitorCache[A_Index] := {
Left: MonitorLeft,
Right: MonitorRight,
Top: MonitorTop,
Bottom: MonitorBottom,
Width: MonitorRight - MonitorLeft,
Height: MonitorBottom - MonitorTop
}
}
}
; 初始化缓存
UpdateMonitorCache()
; 设置定时更新(每30秒)
SetTimer, UpdateMonitorCache, 30000
; 使用缓存的显示器信息
GetMonitorInfo(monitorNumber) {
global MonitorCache
return (monitorNumber >= 1 && monitorNumber <= MonitorCache.Count) ? MonitorCache[monitorNumber] : ""
}
七、完整脚本模板:多显示器管理工具箱
以下是一个整合了多种功能的多显示器管理脚本模板,你可以根据需要进行修改和扩展:
; AutoHotkey多显示器管理工具箱
; 版本: 1.0
; 功能: 提供多显示器环境下的窗口管理、布局保存和应用启动功能
; ==============================================
; 配置区 - 根据你的需求修改以下设置
; ==============================================
; 保存布局文件路径
layoutFilePath := A_ScriptDir "\monitor_layouts.ini"
; 默认应用程序路径
apps := {
browser: "chrome.exe",
editor: "code.exe",
terminal: "cmd.exe",
messenger: "slack.exe"
}
; ==============================================
; 初始化 - 程序启动时执行
; ==============================================
#Persistent
#SingleInstance Force
; 缓存显示器信息
UpdateMonitorCache()
; 监听显示器变化
OnMessage(0x7E, "OnDisplayChange")
; 显示欢迎信息
MsgBox, AutoHotkey多显示器管理工具箱已启动`n检测到 %MonitorCache.Count% 个显示器
return
; ==============================================
; 核心功能实现
; ==============================================
; 更新显示器缓存
UpdateMonitorCache() {
global MonitorCache
MonitorCache := {}
SysGet, MonitorCount, MonitorCount
MonitorCache.Count := MonitorCount
Loop, %MonitorCount% {
SysGet, Monitor, Monitor, %A_Index%
MonitorCache[A_Index] := {
Left: MonitorLeft,
Right: MonitorRight,
Top: MonitorTop,
Bottom: MonitorBottom,
Width: MonitorRight - MonitorLeft,
Height: MonitorBottom - MonitorTop
}
}
}
; 显示器变化处理
OnDisplayChange() {
Sleep, 1000 ; 等待系统稳定
UpdateMonitorCache()
TrayTip, 显示器配置已更改, 检测到 %MonitorCache.Count% 个显示器, 3
}
; 移动窗口到指定显示器
MoveWindowToMonitor(winTitle, monitorNumber, maximize=false) {
global MonitorCache
if (monitorNumber < 1 || monitorNumber > MonitorCache.Count) {
TrayTip, 错误, 无效的显示器编号: %monitorNumber%, 2
return false
}
monitor := MonitorCache[monitorNumber]
; 获取窗口当前状态
WinGet, MinMax, MinMax, %winTitle%
; 移动窗口
WinMove, %winTitle%,, monitor.Left, monitor.Top
; 调整大小
if (maximize) {
WinMaximize, %winTitle%
} else {
; 恢复窗口大小并居中
if (MinMax = 1)
WinRestore, %winTitle%
WinGetPos,,, currentW, currentH, %winTitle%
newW := (currentW > monitor.Width*0.8) ? monitor.Width*0.8 : currentW
newH := (currentH > monitor.Height*0.8) ? monitor.Height*0.8 : currentH
newX := monitor.Left + (monitor.Width - newW)/2
newY := monitor.Top + (monitor.Height - newH)/2
WinMove, %winTitle%,, newX, newY, newW, newH
}
return true
}
; 保存窗口布局
SaveWindowLayout(layoutName) {
global layoutFilePath
; 创建布局节名
section := "Layout_" layoutName
FileDelete, %layoutFilePath% ; 清除现有文件
; 获取所有窗口
WinGet, winList, List
count := 0
Loop, %winList% {
winID := winList%A_Index%
; 跳过最小化窗口
WinGet, MinMax, MinMax, ahk_id %winID%
if (MinMax = -1)
continue
; 获取窗口标题
WinGetTitle, Title, ahk_id %winID%
if (Title = "")
continue
; 获取窗口位置和大小
WinGetPos, x, y, w, h, ahk_id %winID%
; 保存到文件
IniWrite, %x%|%y%|%w%|%h%|%MinMax%, %layoutFilePath%, %section%, %Title%
count++
}
TrayTip, 布局已保存, 已保存 %count% 个窗口位置, 2
return count
}
; 加载窗口布局
LoadWindowLayout(layoutName) {
global layoutFilePath
section := "Layout_" layoutName
if !IniRead, winTitles, %layoutFilePath%, %section% {
TrayTip, 错误, 未找到布局: %layoutName%, 2
return false
}
count := 0
Loop, parse, winTitles, `n, `r {
if (A_LoopField = "")
continue
; 读取窗口信息
IniRead, winData, %layoutFilePath%, %section%, %A_LoopField%
StringSplit, data, winData, |
; 移动并调整窗口
if WinExist(%A_LoopField%) {
WinMove, %A_LoopField%,, data1, data2, data3, data4
if (data5 = 1)
WinMaximize, %A_LoopField%
count++
}
}
TrayTip, 布局已加载, 已恢复 %count% 个窗口位置, 2
return true
}
; 设置工作区
SetupWorkspace(workspaceName) {
global apps, MonitorCache
; 关闭现有应用
for app, path in apps {
Process, Close, % path
}
Sleep, 500
; 根据工作区类型和显示器数量设置
if (workspaceName = "development") {
; 开发工作区
; 主显示器: 代码编辑器和终端
if (MonitorCache.Count >= 1) {
Run, %apps.editor%
WinWait, ahk_exe %apps.editor%
MoveWindowToMonitor("ahk_exe " apps.editor, 1, true)
Run, %apps.terminal%
WinWait, ahk_exe %apps.terminal%
MoveWindowToMonitor("ahk_exe " apps.terminal, 1)
}
; 第二显示器: 浏览器和文档
if (MonitorCache.Count >= 2) {
Run, %apps.browser% https://docs.ahkscript.org
WinWait, ahk_exe %apps.browser%
MoveWindowToMonitor("ahk_exe " apps.browser, 2, true)
}
; 第三显示器: 通讯工具
if (MonitorCache.Count >= 3) {
Run, %apps.messenger%
WinWait, ahk_exe %apps.messenger%
MoveWindowToMonitor("ahk_exe " apps.messenger, 3, true)
}
}
; 可以添加更多工作区类型...
}
; ==============================================
; 快捷键定义
; ==============================================
; Win+Alt+数字: 移动活动窗口到指定显示器
!#1::MoveWindowToMonitor("A", 1)
!#2::MoveWindowToMonitor("A", 2)
!#3::MoveWindowToMonitor("A", 3)
; Win+Shift+数字: 移动并最大化活动窗口到指定显示器
+!#1::MoveWindowToMonitor("A", 1, true)
+!#2::MoveWindowToMonitor("A", 2, true)
+!#3::MoveWindowToMonitor("A", 3, true)
; Win+Ctrl+S: 保存当前布局
^#s::
InputBox, layoutName, 保存布局, 请输入布局名称:, , 300, 150
if (ErrorLevel)
return
SaveWindowLayout(layoutName)
return
; Win+Ctrl+L: 加载布局
^#l::
InputBox, layoutName, 加载布局, 请输入布局名称:, , 300, 150
if (ErrorLevel)
return
LoadWindowLayout(layoutName)
return
; Win+Ctrl+D: 开发工作区
^#d::SetupWorkspace("development")
通过本指南,你已经掌握了AutoHotkey多显示器管理的核心技术和实用技巧。无论是简单的窗口移动还是复杂的工作区自动化,AutoHotkey都能帮助你充分发挥多显示器环境的优势,提升工作效率。记住,最有效的多显示器管理方案是根据你的具体需求定制的,希望这些示例能为你提供灵感,创建出最适合自己的自动化脚本。
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
LongCat-AudioDiT-1BLongCat-AudioDiT 是一款基于扩散模型的文本转语音(TTS)模型,代表了当前该领域的最高水平(SOTA),它直接在波形潜空间中进行操作。00- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
HY-Embodied-0.5这是一套专为现实世界具身智能打造的基础模型。该系列模型采用创新的混合Transformer(Mixture-of-Transformers, MoT) 架构,通过潜在令牌实现模态特异性计算,显著提升了细粒度感知能力。Jinja00
FreeSql功能强大的对象关系映射(O/RM)组件,支持 .NET Core 2.1+、.NET Framework 4.0+、Xamarin 以及 AOT。C#00