Windows 自带虚拟桌面以后,很多人会用 Ctrl + Win + 左右方向键 切换工作区。但如果想用 AHK 自动整理窗口,比如把浏览器丢到第 2 个桌面、把记事本固定到所有桌面、给虚拟桌面做一套自己的热键,普通窗口命令就不够用了。

VDAHK 是我整理的一个 Windows 虚拟桌面操作库,基于 FuPeiJiang/VD.ahk 的 v1 移植,并补了一些和站内示例一致的兼容写法。它适合做虚拟桌面热键、窗口归类、把指定窗口或应用固定到所有桌面。

它能解决什么问题

  • 查询当前处于第几个虚拟桌面。
  • 查询系统当前有多少个虚拟桌面。
  • 切换到指定桌面,或切换到左右相邻桌面。
  • 把当前窗口移动到指定桌面,移动后也可以跟随过去。
  • 创建、删除虚拟桌面。
  • 把某个窗口固定到所有桌面。
  • 把某个应用的窗口固定到所有桌面。

对新手来说,最容易理解的用法就是:把 Windows 原本分散的虚拟桌面操作,整理成 AHK 能直接调用的方法。这样就可以按自己的习惯做热键,而不是被系统默认热键限制。

基础用法

#Requires AutoHotkey v1.1
#Include <VD>

MsgBox, % "当前桌面:" VD.getCurrentDesktopNum()
MsgBox, % "桌面总数:" VD.getCount()

VD.goToDesktopNum(1)
VD.goToRelativeDesktopNum(1)

VD.MoveWindowToDesktopNum("A", 2)
VD.MoveWindowToDesktopNum("A", 2).follow()

窗口固定和应用固定

虚拟桌面里有两个很实用的概念:一个是把“当前窗口”显示到所有桌面,另一个是把“这个应用的窗口”显示到所有桌面。前者适合临时固定一个窗口,后者适合让某类工具长期跟随,比如剪贴板工具、悬浮面板、监控窗口。

; 固定或取消固定当前窗口
VD.TogglePinWindow("A")
VD.PinWindow("A")
VD.UnPinWindow("A")
MsgBox, % VD.IsWindowPinned("A")

; 固定或取消固定当前窗口所属应用
VD.TogglePinApp("A")
VD.PinApp("A")
VD.UnPinApp("A")
MsgBox, % VD.IsAppPinned("A")

做成热键会更顺手

这个库真正适合放进常驻脚本。比如数字键切换桌面,组合键把当前窗口丢到左右桌面,再跟随过去。整理多窗口工作区时,这类热键比鼠标点任务视图快很多。

1::VD.goToDesktopNum(1)
2::VD.goToDesktopNum(2)
3::VD.goToDesktopNum(3)

^#Left::VD.goToRelativeDesktopNum(-1)
^#Right::VD.goToRelativeDesktopNum(1)

#!Left::VD.MoveWindowToRelativeDesktopNum("A", -1).follow()
#!Right::VD.MoveWindowToRelativeDesktopNum("A", 1).follow()

使用前要知道的边界

VDAHK 不依赖外部 DLL,但它使用的是 Windows 虚拟桌面相关的内部 COM 接口。这个接口不是微软公开承诺长期稳定的 SDK,所以系统版本差异、Windows 更新,都可能影响兼容性。

我建议第一次运行时先测试只读功能,比如当前桌面编号和桌面数量。确认正常后,再尝试创建桌面、删除桌面、移动窗口这些会改变系统状态的操作。尤其是在工作机上,不要一上来就让脚本批量创建或删除桌面。

适合哪些人

如果你只是偶尔手动切换桌面,系统默认热键就够了。如果你经常把不同软件分到不同工作区,或者想做一套“按键整理窗口”的脚本,VDAHK 就很有价值。它不是完整稳定的官方虚拟桌面 SDK,更像一个实用的 AHK 虚拟桌面工具库。

VD.ahk【文章底部有完整示例】

demo代码片段展示:

#NoEnv
#SingleInstance Force
SetBatchLines, -1
SendMode Input
#Include <VD>

; VDAHK 中文演示
; 先运行脚本,再按下面热键测试。
; 注意:创建、删除、切换虚拟桌面都会影响当前系统桌面状态。

VD.createUntil(3)

提示 =
(
VDAHK 虚拟桌面演示已启动。

F1:显示当前桌面编号
F2:显示虚拟桌面总数
1 / 2 / 3:切换到第 1 / 2 / 3 个桌面
Ctrl + Win + Left / Right:切换到左 / 右相邻桌面
Alt + Win + Left / Right:移动当前窗口到左 / 右相邻桌面并跟随
Numpad0:固定 / 取消固定当前窗口到所有桌面
Ctrl + Numpad0:固定当前窗口到所有桌面
Alt + Numpad0:取消固定当前窗口
F3:退出演示
)

MsgBox, 64, VDAHK 演示, %提示%
return

1::VD.goToDesktopNum(1)
2::VD.goToDesktopNum(2)
3::VD.goToDesktopNum(3)

^#Left::VD.goToRelativeDesktopNum(-1)
^#Right::VD.goToRelativeDesktopNum(1)

#!Left::VD.MoveWindowToRelativeDesktopNum("A", -1).follow()
#!Right::VD.MoveWindowToRelativeDesktopNum("A", 1).follow()

Numpad0::VD.TogglePinWindow("A")
^Numpad0::VD.PinWindow("A")
!Numpad0::VD.UnPinWindow("A")

F1::
    MsgBox, 64, VDAHK, % "当前桌面编号:" VD.getCurrentDesktopNum()
return

F2::
    MsgBox, 64, VDAHK, % "虚拟桌面总数:" VD.getCount()
return

F3::ExitApp
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。