如何在Windows 11任务栏系统托盘显示秒数及修复置顶失效问题
原问题内容
众所周知,微软并未在Windows 11任务栏的系统托盘区域提供时钟秒数显示功能,因此我开发了一个小工具来实现该需求。
该工具通过简单的计时器和标签控件在时钟旁显示秒数,我使用的代码如下:
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.StartPosition = FormStartPosition.Manual Me.Location = New Point(1891, 1029) Me.Size = New Size(21, 18) Me.TransparencyKey = Color.LightBlue Me.BackColor = Color.LightBlue End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick Label1.Text = ":" + Format(Now, "ss") End Sub End Class
我已将窗体的Always on top属性设置为true,但点击任务栏时该窗体会消失,请问有什么方法可以修复该问题?谢谢。
解决方案
点击任务栏时窗体被覆盖,本质是普通TopMost属性仅能保证窗体在普通应用层级置顶,无法和系统任务栏的窗口层级竞争,同时系统默认会将激活任务栏时的后台应用窗口Z序下调,可通过以下步骤修复:
- 基础属性设置
在窗体设计器中将ShowInTaskbar属性设置为False,避免程序在任务栏生成图标,点击任务栏时触发窗体最小化逻辑,同时保留TopMost = True的设置。 - 重写窗体扩展样式,提升窗口层级
在Form1类中添加如下代码,修改窗口的扩展样式为工具窗口,同时让窗口获得更高的顶层优先级:
Protected Overrides ReadOnly Property CreateParams As CreateParams Get Dim cp As CreateParams = MyBase.CreateParams ' 设置为工具窗口,不会出现在Alt+Tab列表,窗口层级更高 cp.ExStyle = cp.ExStyle Or &H80 ' WS_EX_TOOLWINDOW cp.ExStyle = cp.ExStyle Or &H8 ' WS_EX_TOPMOST Return cp End Get End Property
- (可选)动态适配窗体位置,避免不同分辨率下位置偏移
原代码写死的坐标仅适配当前屏幕分辨率,可替换原有逻辑,自动获取任务栏位置放置秒数显示,完整修改后代码如下:
' 代码文件最顶部引入命名空间 Imports System.Runtime.InteropServices Public Class Form1 ' 导入获取任务栏信息的系统API <DllImport("user32.dll")> Private Shared Function GetWindowRect(hWnd As IntPtr, ByRef lpRect As RECT) As Boolean End Function <DllImport("user32.dll")> Private Shared Function FindWindow(lpClassName As String, lpWindowName As String) As IntPtr End Function Private Structure RECT Public Left As Integer Public Top As Integer Public Right As Integer Public Bottom As Integer End Structure Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.StartPosition = FormStartPosition.Manual ' 动态获取任务栏位置并计算放置坐标,可自行调整偏移量适配显示效果 Dim taskbarHwnd = FindWindow("Shell_TrayWnd", Nothing) Dim taskbarRect As RECT GetWindowRect(taskbarHwnd, taskbarRect) Me.Location = New Point(taskbarRect.Right - 40, taskbarRect.Top + 2) Me.Size = New Size(21, 18) Me.TransparencyKey = Color.LightBlue Me.BackColor = Color.LightBlue Me.ShowInTaskbar = False End Sub ' 重写窗口参数提升层级 Protected Overrides ReadOnly Property CreateParams As CreateParams Get Dim cp As CreateParams = MyBase.CreateParams cp.ExStyle = cp.ExStyle Or &H80 ' WS_EX_TOOLWINDOW cp.ExStyle = cp.ExStyle Or &H8 ' WS_EX_TOPMOST Return cp End Get End Property Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick Label1.Text = ":" + Format(Now, "ss") End Sub End Class
修改完成后重新编译运行,点击任务栏时窗体就不会再被覆盖消失,同时也不会出现在Alt+Tab的切换列表中,不会干扰正常窗口切换操作。
内容的提问来源于stack exchange,提问作者Mattia
相关产品推荐
相关产品推荐

