Functional Assistance for Windows 11 Taskbar
Windows 11的任务栏,确实很鸡肋。于是想办法做功能增强。
1. 存在问题
对比历史版本Windows(XP、7、10)的任务栏,Windows 11任务栏存在以下缺点:
- 可自定义功能不多
- 不支持任务平铺,即不进行分组合并显示(注,2023-11-20,发现Win11更新后可以设置任务栏图标不合并)
- 不能添加快捷菜单集合
- 不能调整高度,占据屏幕空间比较多
2. 可选方案
2.1. ExplorerPatcher
- 项目地址:valinet/ExplorerPatcher: This project aims to enhance the working environment on Windows
- 优点:开源项目,带回Windows任务栏的传统功能。
- 缺点:受Windows 11升级后的影响很大。系统升级后试过导致不能进入桌面,或者自身不能运行。
2.2. StartAllBack
- 项目地址:StartAllBack to fix all Windows 11 deal-breaking UI issues
- 优点:带回Windows任务栏的传统功能、窗口样式等。
- 缺点:收费软件。
2.3. CLaunch
- 项目地址:CLaunch
- 优点:免费,轻量,对系统没有任何影响。
- 缺点:只是个弹出菜单(不能替代任务栏),不开源。
3. 解决方案
最后,我选择了基于CLaunch,实现任务栏辅助。主要是解耦,避免对系统的影响,也便于维护、迁移和备份。
3.1. 任务栏设置
任务栏设置为自动隐藏,节省屏幕空间。
注:由于任务栏可以设置图标不合并,没必要隐藏任务栏了。
3.2. 部署CLaunch
其当前最新版v4.05,由于在virustotal.com被大量杀毒软件检测出木马
,所以选择了v4.04。
皮肤推荐:yurafuca/claunch-win10: Windows 10 Flavored CLaunch Skin.
我比较喜欢只有一列的布局(像《刀剑神域》游戏里的菜单),并且设置显示规则为:
- 双击屏幕左侧边缘显示
- 双击桌面显示
- 快捷键 Ctrl + Shift + Q 显示
- 任务栏添加固定图标,点击即可显示
3.3. 常用快捷方式
常用的快捷方式,会保存到指定文件夹,在CLaunch指向该文件夹,并以子菜单显示。这样维护、备份、迁移都比较简单。
3.4. 平铺显示任务列表
Windows 11自动一个平铺任务列表,按 Win + Tab 显示。可以编写vbs文件,并在Claunch设置为按钮,现实点击显示。相关代码如下:
rem 文件名:tasks.vbs
rem 运行平铺显示的任务列表,Windows默认快捷键:Win + Tab
rem 参考:https://learn.microsoft.com/en-us/windows/win32/shell/shell-windowswitcher
set objShell = CreateObject("shell.application")
objShell.WindowSwitcher
set objShell = nothing
3.5. 添加快捷功能
比如要在Claunch添加按钮,实现显示桌面,可以使用vbs模拟按键实现。相关代码如下:
rem 文件名:desktop.vbs
rem 显示桌面,Windows默认快捷键:Win + D
rem 参考:https://learn.microsoft.com/en-us/windows/win32/shell/shell-toggledesktop
set objShell = CreateObject("shell.application")
objShell.ToggleDesktop
set objShell = nothing
关于vbs模拟按键,可以参考:VBS自动按键大全,vbs基本和特殊按键 - 笨蛋敏 - 博客园
例如要实现显示Windows开始菜单,可以使用Ctrl + ESC,模拟Win按键。相关代码如下:
rem 文件名:start.vbs
rem 显示开始菜单,Windows默认快捷键:Win
Set wsShell = WScript.CreateObject("WScript.Shell")
wsShell.SendKeys "^{ESC}"
set wsShell = nothing
3.6. 通讯软件的消息提醒
通讯软件有消息时,任务栏有提醒效果。如果任务栏自动隐藏,收到消息时会自动显示。如果觉得还不够,可能会导致错过消息,可以设置通讯软件(例如TIM),收到新消息就弹出对话窗口。
3.7. 显示时间
目前没有很好的解决方案。要么就装个显示时间的软件(例如 DesktopClock),要么就弹窗显示当前时间(代码如下)。但是两个方案都不够好用。
rem 文件名:show_time.vbs
rem 弹出当前日期时间
rem 注意:本VBScript文件涉及中文显示,需要使用ANSI编码
rem
rem 参考:
rem https://learn.microsoft.com/en-us/windows/win32/shell/shell-windows
rem 弹窗标题
title = "当前时间"
rem 弹窗保持的秒数,指定时间之后自动关闭。0为不自动关闭。
holdSec = 3
curDateTime = Now()
weekdayInt = Weekday(curDateTime)
Select Case weekdayInt
Case 1
weekdayStr="星期日"
Case 2
weekdayStr="星期一"
Case 3
weekdayStr="星期二"
Case 4
weekdayStr="星期三"
Case 5
weekdayStr="星期四"
Case 6
weekdayStr="星期五"
Case 7
weekdayStr="星期六"
Case Else
weekdayStr="星期日"
End Select
msg = Year(curDateTime) & "-" & Right("0" & Month(curDateTime), 2) & "-" & Right("0" & Day(curDateTime), 2)
msg = msg & vbCrLf & Right("0" & Hour(curDateTime), 2) & ":" & Right("0" & Minute(curDateTime), 2) & ":" & Right("0" & Second(curDateTime), 2)
msg = msg & vbCrLf & weekdayStr
rem CreateObject("Wscript.Shell").Popup msg, 3, title, 64
Set objShell = CreateObject("WScript.Shell")
objShell.Popup msg, holdSec, title, 64
Set objShell = nothing