TaskbarX源代码分析:Main.vb核心逻辑详解

TaskbarX源代码分析:Main.vb核心逻辑详解

【免费下载链接】TaskbarX Center Windows taskbar icons with a variety of animations and options. 【免费下载链接】TaskbarX 项目地址: https://gitcode.com/gh_mirrors/ta/TaskbarX

引言:任务栏图标居中的技术实现

TaskbarX是一款允许用户将Windows任务栏图标居中并应用多种动画效果的开源工具。本文将深入分析其核心模块Main.vb的实现逻辑,揭示任务栏图标居中、动画效果和系统交互的技术细节。通过本文,读者将能够理解:

  • 任务栏图标定位的底层原理
  • 动画系统的设计与实现
  • 系统钩子与消息处理机制
  • 多显示器与高DPI环境的适配策略

1. 程序入口与初始化流程

Main.vb作为程序入口点,负责初始化系统环境、解析命令行参数和启动核心服务。其执行流程可分为四个阶段:

1.1 设置默认配置

程序启动时首先初始化Settings类的静态属性,设置任务栏样式、偏移量、动画参数等默认值:

'Set default settings
Settings.TaskbarStyle = 0
Settings.PrimaryTaskbarOffset = 0
Settings.SecondaryTaskbarOffset = 0
Settings.CenterPrimaryOnly = 0
Settings.AnimationStyle = "cubiceaseinout"
Settings.AnimationSpeed = 300
Settings.LoopRefreshRate = 400
'... 其他30+项配置

1.2 命令行参数解析

通过Environment.GetCommandLineArgs()获取并解析命令行参数,支持动态修改配置:

For Each argument In arguments
    If argument.Contains("-stop") Then
        stopgiven = True
    End If
    If argument.Contains("-tbs=") Then
        Settings.TaskbarStyle = CInt(val(1))
    End If
    '... 支持20+种命令行参数

关键参数包括:

  • -stop: 停止所有TaskbarX实例并恢复任务栏
  • -tbs: 设置任务栏样式(0-5)
  • -as: 指定动画类型(cubiceaseinout/linear等)
  • -asp: 动画速度(毫秒)

1.3 单实例保障

通过进程名检查并终止其他TaskbarX实例,确保单实例运行:

For Each prog As Process In Process.GetProcessesByName("TaskbarX")
    If Not prog.Id = Process.GetCurrentProcess.Id Then
        prog.Kill()
    End If
Next

1.4 系统环境准备

配置进程优先级、DPI感知模式,并等待Windows任务栏组件加载完成:

'提升动画流畅度
currentProcess.PriorityClass = ProcessPriorityClass.Idle

'高DPI支持
Win32.SetProcessDpiAwareness(Win32.PROCESS_DPI_AWARENESS.Process_Per_Monitor_DPI_Aware)

'等待Shell_TrayWnd就绪
Do
    Thread.Sleep(250)
    Dim Shell_TrayWnd = Win32.FindWindowByClass("Shell_TrayWnd", CType(0, IntPtr))
    '... 获取任务栏句柄
Loop Until Not Handle = Nothing

2. 核心功能模块架构

TaskbarX采用模块化设计,Main.vb作为协调中心,整合了四大功能模块:

mermaid

2.1 模块交互流程

mermaid

3. 任务栏居中实现原理

任务栏图标居中是TaskbarX的核心功能,由TaskbarCenter.TaskbarCenterer()实现,其技术要点包括:

3.1 窗口句柄获取

通过Windows API查找任务栏相关窗口组件:

'获取主任务栏
Dim Shell_TrayWnd = Win32.FindWindowByClass("Shell_TrayWnd", CType(0, IntPtr))
Dim ReBarWindow32 = Win32.FindWindowEx(Shell_TrayWnd, CType(0, IntPtr), "ReBarWindow32", Nothing)
Dim MSTaskSwWClass = Win32.FindWindowEx(ReBarWindow32, CType(0, IntPtr), "MSTaskSwWClass", Nothing)
Dim MSTaskListWClass = Win32.FindWindowEx(MSTaskSwWClass, CType(0, IntPtr), "MSTaskListWClass", Nothing)

3.2 位置计算算法

通过辅助功能接口(MSAA) 获取任务栏图标布局信息,计算居中位置:

Dim accessible As Accessibility.IAccessible = MSAA.GetAccessibleObjectFromHandle(MSTaskListWClass)
Dim children() As Accessibility.IAccessible = MSAA.GetAccessibleChildren(accessible)

'获取最后一个图标的位置
For Each childx As Accessibility.IAccessible In children
    If CInt(childx.accRole(0)) = CInt(22) Then '工具栏类型
        LastChildPos = GetLocation(childx, MSAA.GetAccessibleChildren(childx).Length)
        Exit For
    End If
Next

'计算居中位置
If Orientation = "H" Then '水平任务栏
    TaskbarCount = cL + cW '图标区域总宽度
    Position = CInt((TrayWndWidth - TaskbarCount) / 2) '居中位置
Else '垂直任务栏
    TaskbarCount = cT + cH
    Position = CInt((TrayWndHeight - TaskbarCount) / 2)
End If

3.3 动态监测与调整

通过循环监测任务栏状态变化,实现动态调整:

Do
    '检查分辨率变化
    If Screen.PrimaryScreen.Bounds.Width = Settings.SkipResolution Then
        RevertToZero()
        Exit Do
    End If
    
    '检查全屏应用
    If Settings.CheckFullscreenApp = 1 Then
        Dim activewindow = Win32.GetForegroundWindow()
        '判断是否全屏
        If activewindowsize.Top = curmonx.Bounds.Top And ... Then
            Settings.Pause = True
            '等待全屏结束
            Do
                Thread.Sleep(500)
                activewindow = Win32.GetForegroundWindow()
            Loop While ...
            Settings.Pause = False
        End If
    End If
    
    '检测任务栏变化
    If Not results = oldresults Then
        '重新计算位置
        Dim t3 As Thread = New Thread(AddressOf InitPositionCalculator)
        t3.Start()
    End If
    
    '根据电源状态调整刷新率
    If SystemInformation.PowerStatus.PowerLineStatus = PowerLineStatus.Offline Then
        Thread.Sleep(Settings.OnBatteryLoopRefreshRate)
    Else
        Thread.Sleep(Settings.LoopRefreshRate)
    End If
Loop

4. 动画系统设计

TaskbarX提供10+种动画效果,由TaskbarAnimate.vb实现,核心原理是通过缓动函数控制窗口位置的渐进变化。

4.1 动画触发流程

mermaid

4.2 缓动函数实现

Easings.vb提供多种缓动算法,以立方缓动为例:

Public Function CubicEaseInOut(t As Double, b As Double, c As Double, d As Double) As Double
    t /= d / 2
    If t < 1 Then Return c / 2 * t * t * t + b
    t -= 2
    Return c / 2 * (t * t * t + 2) + b
End Function

4.3 位置插值计算

动画线程根据缓动函数计算中间位置并应用:

While Not elapsed >= duration
    elapsed = CInt(sw.ElapsedMilliseconds)
    Dim newValue As Integer = CInt((easing(elapsed, minValue, maxValue, duration)))
    
    If orient = "H" Then
        Win32.SetWindowPos(hwnd, IntPtr.Zero, newValue, 0, 0, 0, 
            Win32.SWP_NOSIZE Or Win32.SWP_ASYNCWINDOWPOS Or ...)
    Else
        Win32.SetWindowPos(hwnd, IntPtr.Zero, 0, newValue, 0, 0, ...)
    End If
End While

5. 系统集成与消息处理

TaskbarX通过系统钩子和消息处理与Windows环境深度集成:

5.1 托盘图标与用户交互

创建系统托盘图标并处理用户输入:

noty.Text = "TaskbarX (L = Restart) (M = Config) (R = Stop)"
noty.Icon = My.Resources.icon
noty.Visible = True
AddHandler noty.MouseClick, AddressOf MnuRef_Click

'鼠标事件处理
Public Shared Sub MnuRef_Click(sender As Object, e As MouseEventArgs)
    If (e.Button = MouseButtons.Left) Then
        Application.Restart() '左键重启
    ElseIf (e.Button = MouseButtons.Right) Then
        TaskbarCenter.RevertToZero() '右键停止
        End
    ElseIf (e.Button = MouseButtons.Middle) Then
        Process.Start("TaskbarX Configurator.exe") '中键打开配置
    End If
End Sub

5.2 系统事件响应

注册系统事件处理程序,响应显示设置变化、会话切换等事件:

AddHandler SystemEvents.DisplaySettingsChanged, AddressOf DPChange
AddHandler SystemEvents.SessionSwitch, AddressOf SystemEvents_SessionSwitch

'显示设置变更处理
Public Shared Sub DPChange(ByVal sender As Object, ByVal e As EventArgs)
    Thread.Sleep(1000)
    Application.Restart() '重启以适应新分辨率
End Sub

5.3 任务栏状态恢复

程序退出或停止时恢复任务栏原始状态:

Public Shared Sub RevertToZero()
    For Each Taskbar In windowHandles
        '恢复任务栏位置
        Win32.SetWindowPos(CType(TaskList, IntPtr), IntPtr.Zero, 0, 0, 0, 0, 
            Win32.SWP_NOSIZE Or Win32.SWP_ASYNCWINDOWPOS ...)
        '显示被隐藏的任务栏元素
        Win32.ShowWindow(MStart, Win32.ShowWindowCommands.Show)
        '恢复透明度
        Win32.SetLayeredWindowAttributes(CType(Taskbar, IntPtr), 0, 255, &H2)
    Next
End Sub

6. 性能优化策略

为确保流畅体验,TaskbarX采用多重优化措施:

6.1 资源管理

Public Shared Function ClearMemory() As Int32
    GC.Collect()
    GC.WaitForPendingFinalizers()
    GC.Collect()
    Return Win32.SetProcessWorkingSetSize(Diagnostics.Process.GetCurrentProcess.Handle, -1, -1)
End Function

6.2 条件刷新机制

根据电源状态动态调整刷新率:

If SystemInformation.PowerStatus.PowerLineStatus = PowerLineStatus.Offline Then
    Thread.Sleep(Settings.OnBatteryLoopRefreshRate) '电池模式降低刷新率
Else
    Thread.Sleep(Settings.LoopRefreshRate) '电源模式正常刷新率
End If

6.3 无效区域过滤

避免不必要的重计算:

If Math.Abs(CInt((valueToReach - oldpos))) <= 10 Then
    '位置变化小于10像素时不触发动画
    Exit Sub
End If

7. 高级功能实现

7.1 多显示器支持

通过枚举Shell_SecondaryTrayWnd窗口支持多显示器任务栏:

If Screen.AllScreens.Count >= 2 Then
    Try
        windowHandles.Add(Win32.FindWindow("Shell_SecondaryTrayWnd", Nothing))
    Catch
    End Try
End If

7.2 任务栏样式定制

支持五种任务栏样式,通过Windows API修改任务栏属性:

If Settings.TaskbarStyle = 1 Or Settings.TaskbarStyle = 2 Or ... Then
    Dim t2 As Thread = New Thread(AddressOf TaskbarStyle.TaskbarStyler)
    t2.Start()
End If

7.3 全屏应用检测

自动检测全屏应用并临时禁用居中效果:

Dim activewindow = Win32.GetForegroundWindow()
Win32.GetWindowRect(activewindow, activewindowsize)
If activewindowsize.Top = curmonx.Bounds.Top And ... Then
    '全屏应用检测到
    Settings.Pause = True
    '等待全屏结束
    Do
        Thread.Sleep(500)
        activewindow = Win32.GetForegroundWindow()
    Loop While ...
    Settings.Pause = False
End If

8. 总结与扩展

Main.vb作为TaskbarX的核心,通过模块化设计和Windows API调用,实现了任务栏图标居中这一核心功能。其技术亮点包括:

  1. 精细的窗口控制:通过系统API直接操作任务栏窗口句柄
  2. 高效的动画系统:基于缓动函数的平滑位置插值
  3. 鲁棒的系统集成:处理各类系统事件和边缘情况
  4. 多场景适配:支持多显示器、高DPI和电源管理

8.1 潜在优化方向

  • 使用DirectComposition替代GDI实现更流畅动画
  • 添加UWP应用支持
  • 实现Wayland协议支持(适用于WSL或Linux环境)

8.2 开发建议

对于希望扩展TaskbarX功能的开发者,建议:

  1. 熟悉Windows用户界面自动化(UI Automation)API
  2. 了解DWM(桌面窗口管理器)合成原理
  3. 掌握WPF或WinUI3以构建更现代的配置界面

通过深入理解TaskbarX的实现原理,开发者不仅可以定制任务栏行为,还能掌握Windows桌面应用开发的高级技巧。

【免费下载链接】TaskbarX Center Windows taskbar icons with a variety of animations and options. 【免费下载链接】TaskbarX 项目地址: https://gitcode.com/gh_mirrors/ta/TaskbarX

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值