You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:39:01