找回密码
 立即注册
首页 业界区 安全 PowerShell实现全屏七彩渐变 · 呼吸 · 屏保 ...

PowerShell实现全屏七彩渐变 · 呼吸 · 屏保

羊舌正清 2025-6-1 21:02:29
引言

想做一下屏幕保护程序的效果-----全屏颜色渐变,类似呼吸灯的效果。就用Windows自带的PowerShell脚本。脚本预设好了七彩颜色,然后循环变化。
首先

我们先实现七彩循环切换的全屏效果,也就是不带渐变。
要想实现全屏颜色填充,必须借助"窗口"。对于PowerShell而言,最直接的方法莫过于调用程序集System.Windows.Forms,让窗口全屏化,隐藏标题栏,去除边框,如下:
  1. Add-Type -AssemblyName System.Windows.Forms  # 加载System.Windows.Forms库
  2. # 创建一个新的Form对象
  3. $form = New-Object system.Windows.Forms.Form  
  4. $form.Text = "Breathing Effect"              # 设置窗体标题为"Breathing Effect"
  5. $form.TopMost = $true                        # 设置窗体始终在最上层
  6. $form.FormBorderStyle = 'None'               # 移除窗体边框
  7. $form.WindowState = 'Maximized'              # 最大化窗体以实现全屏效果
复制代码
然后定义颜色,七彩色,红橙黄绿青蓝紫,使用System.Drawing中的Color枚举:
  1. # 定义颜色数组
  2. $colors = @(                                # 定义一个包含多种颜色的颜色数组
  3.     [System.Drawing.Color]::Red,            # 红色
  4.     [System.Drawing.Color]::Orange,         # 橙色
  5.     [System.Drawing.Color]::Yellow,         # 黄色
  6.     [System.Drawing.Color]::Green,          # 绿色
  7.     [System.Drawing.Color]::Blue,           # 蓝色
  8.     [System.Drawing.Color]::Indigo,         # 靛蓝色
  9.     [System.Drawing.Color]::Violet          # 紫罗兰色
  10. )
复制代码
在设定两个变量:
  1. # 设置初始颜色索引和方向
  2. $currentColorIndex = 0                       # 初始颜色索引设为0(红色)
  3. $direction = 1                               # 方向变量,用于控制颜色变化的方向
复制代码
一个form窗体,背景颜色的设定使用Form.BackColor定义,然后使用 [System.Windows.Forms.Application]::Run来运行窗体对象!
当然,我们希望程序循环往复不断切换颜色,所以需要设定一个定时器,让其隔一定时间切换一次颜色,即调用一次切换函数,此函数见下文:
  1. # 更新颜色函数
  2. function Update-Color {
  3.     # 改变当前颜色索引
  4.     $script:currentColorIndex += $direction   # 根据方向变量更新颜色索引
  5.     # 检查边界条件并反转方向
  6.     if ($script:currentColorIndex -ge ($colors.Length - 1)) {  # 如果颜色索引达到最大值
  7.         $script:direction = -1                  # 反转方向
  8.     } elseif ($script:currentColorIndex -le 0) {             # 如果颜色索引达到最小值
  9.         $script:direction = 1                   # 反转方向
  10.     }
  11.     # 设置窗体背景颜色
  12.     $form.BackColor = $colors[$script:currentColorIndex]  # 将窗体背景颜色设置为当前颜色
  13.     # 延迟一段时间后再次调用Update-Color
  14.     Start-Sleep -Milliseconds 500              # 延迟500毫秒
  15.     [System.Windows.Forms.Application]::DoEvents()  # 处理所有挂起的事件
  16. }
复制代码
 而定时器的定义和启动:
  1. # 启动定时器以定期更新颜色
  2. $timer = New-Object System.Windows.Forms.Timer  # 创建一个新的Timer对象
  3. $timer.Interval = 16.7                            # 设置定时器间隔为100毫秒
  4. $timer.Add_Tick({ Update-Color })                # 添加Tick事件处理程序,每次触发时调用Update-Color函数
  5. $timer.Start()                                   # 启动定时器
复制代码
 
完整代码如下:
  1. Add-Type -AssemblyName System.Windows.Forms  # 加载System.Windows.Forms库
  2. # 创建一个新的Form对象
  3. $form = New-Object system.Windows.Forms.Form  
  4. $form.Text = "Breathing Effect"              # 设置窗体标题为"Breathing Effect"
  5. $form.TopMost = $true                        # 设置窗体始终在最上层
  6. $form.FormBorderStyle = 'None'               # 移除窗体边框
  7. $form.WindowState = 'Maximized'              # 最大化窗体以实现全屏效果# 定义颜色数组
  8. $colors = @(                                # 定义一个包含多种颜色的颜色数组
  9.     [System.Drawing.Color]::Red,            # 红色
  10.     [System.Drawing.Color]::Orange,         # 橙色
  11.     [System.Drawing.Color]::Yellow,         # 黄色
  12.     [System.Drawing.Color]::Green,          # 绿色
  13.     [System.Drawing.Color]::Blue,           # 蓝色
  14.     [System.Drawing.Color]::Indigo,         # 靛蓝色
  15.     [System.Drawing.Color]::Violet          # 紫罗兰色
  16. )# 设置初始颜色索引和方向
  17. $currentColorIndex = 0                       # 初始颜色索引设为0(红色)
  18. $direction = 1                               # 方向变量,用于控制颜色变化的方向# 更新颜色函数function Update-Color {    # 改变当前颜色索引    $script:currentColorIndex += $direction   # 根据方向变量更新颜色索引    # 检查边界条件并反转方向    if ($script:currentColorIndex -ge ($colors.Length - 1)) {  # 如果颜色索引达到最大值        $script:direction = -1                  # 反转方向    } elseif ($script:currentColorIndex -le 0) {             # 如果颜色索引达到最小值        $script:direction = 1                   # 反转方向    }    # 设置窗体背景颜色    $form.BackColor = $colors[$script:currentColorIndex]  # 将窗体背景颜色设置为当前颜色    # 延迟一段时间后再次调用Update-Color    Start-Sleep -Milliseconds 20              # 延迟50毫秒    [System.Windows.Forms.Application]::DoEvents()  # 处理所有挂起的事件}# 启动定时器以定期更新颜色
  19. $timer = New-Object System.Windows.Forms.Timer  # 创建一个新的Timer对象
  20. $timer.Interval = 16.7                            # 设置定时器间隔为100毫秒
  21. $timer.Add_Tick({ Update-Color })                # 添加Tick事件处理程序,每次触发时调用Update-Color函数
  22. $timer.Start()                                   # 启动定时器# 显示窗体[System.Windows.Forms.Application]::Run($form)  # 运行窗体应用程序的消息循环
复制代码
效果如下:
1.gif

其次

现在在这个脚本基础上,加上渐变效果,也就是每次切换颜色,有一个过渡
关键的,是设定一插值参数$offt,参与计算差值颜色,我这里使用math::Round函数,如下:
  1. # 更新颜色函数
  2. function Update-Color {
  3.     param (
  4.         [Parameter(Mandatory=$true)]
  5.         [double]$offt
  6.     )
  7.     # 获取当前颜色和下一个颜色
  8.     $currentColor = $colors[$script:currentColorIndex]
  9.     $nextColor = $colors[$script:nextColorIndex]
  10.     # 计算插值颜色
  11.     $r = [int]([math]::Round($currentColor.R + ($nextColor.R - $currentColor.R) * $offt))
  12.     $g = [int]([math]::Round($currentColor.G + ($nextColor.G - $currentColor.G) * $offt))
  13.     $b = [int]([math]::Round($currentColor.B + ($nextColor.B - $currentColor.B) * $offt))
  14.     # 设置窗体背景颜色
  15.     $form.BackColor = [System.Drawing.Color]::FromArgb($r, $g, $b)
  16.     # 增加插值参数
  17.     $script:offt += 0.01
  18.     # 如果插值参数超过1,则切换到下一个颜色
  19.     if ($script:t -ge 1) {
  20.         $script:currentColorIndex = $script:nextColorIndex
  21.         $script:nextColorIndex += $direction
  22.         # 检查边界条件并反转方向
  23.         if ($script:nextColorIndex -ge $colors.Length) {
  24.             $script:nextColorIndex = $colors.Length - 2
  25.             $script:direction = -1
  26.         } elseif ($script:nextColorIndex -lt 0) {
  27.             $script:nextColorIndex = 1
  28.             $script:direction = 1
  29.         }
  30.         $script:offt = 0
  31.     }
  32. }
复制代码
接着优化一下功能,按 esc 可退出:
  1. # 处理按键事件
  2. $form.Add_KeyDown({
  3.     param(
  4.         [object]$sender,
  5.         [System.Windows.Forms.KeyEventArgs]$e
  6.     )
  7.     if ($e.KeyCode -eq [System.Windows.Forms.Keys]::Escape) {
  8.         $form.Close()  # 关闭窗体
  9.     }
  10. })
复制代码
 
完整代码如下:
  1. Add-Type -AssemblyName System.Windows.Forms  # 加载System.Windows.Forms库
  2. # 创建一个新的Form对象
  3. $form = New-Object system.Windows.Forms.Form  
  4. $form.Text = "Breathing Effect"              # 设置窗体标题为"Breathing Effect"
  5. $form.TopMost = $true                        # 设置窗体始终在最上层
  6. $form.FormBorderStyle = 'None'               # 移除窗体边框
  7. $form.WindowState = 'Maximized'              # 最大化窗体以实现全屏效果# 定义颜色数组
  8. $colors = @(                                # 定义一个包含多种颜色的颜色数组
  9.     [System.Drawing.Color]::Red,            # 红色
  10.     [System.Drawing.Color]::Orange,         # 橙色
  11.     [System.Drawing.Color]::Yellow,         # 黄色
  12.     [System.Drawing.Color]::Green,          # 绿色
  13.     [System.Drawing.Color]::Blue,           # 蓝色
  14.     [System.Drawing.Color]::Indigo,         # 靛蓝色
  15.     [System.Drawing.Color]::Violet          # 紫罗兰色
  16. )# 设置初始颜色索引和方向$currentColorIndex = 0                       # 初始颜色索引设为0(红色)$nextColorIndex = 1                          # 下一个颜色索引设为1(橙色)$direction = 1                               # 方向变量,用于控制颜色变化的方向$offt = 0                                       # 插值参数,范围从0到1# 更新颜色函数function Update-Color {    param (        [Parameter(Mandatory=$true)]        [double]$offt    )    # 获取当前颜色和下一个颜色    $currentColor = $colors[$script:currentColorIndex]    $nextColor = $colors[$script:nextColorIndex]    # 计算插值颜色    $r = [int]([math]::Round($currentColor.R + ($nextColor.R - $currentColor.R) * $offt))    $g = [int]([math]::Round($currentColor.G + ($nextColor.G - $currentColor.G) * $offt))    $b = [int]([math]::Round($currentColor.B + ($nextColor.B - $currentColor.B) * $offt))    # 设置窗体背景颜色    $form.BackColor = [System.Drawing.Color]::FromArgb($r, $g, $b)    # 增加插值参数    $script:offt += 0.01    # 如果插值参数超过1,则切换到下一个颜色    if ($script:offt -ge 1) {        $script:currentColorIndex = $script:nextColorIndex        $script:nextColorIndex += $direction        # 检查边界条件并反转方向        if ($script:nextColorIndex -ge $colors.Length) {            $script:nextColorIndex = $colors.Length - 2            $script:direction = -1        } elseif ($script:nextColorIndex -lt 0) {            $script:nextColorIndex = 1            $script:direction = 1        }        $script:offt = 0    }}# 处理按键事件
  17. $form.Add_KeyDown({
  18.     param(
  19.         [object]$sender,
  20.         [System.Windows.Forms.KeyEventArgs]$e
  21.     )
  22.     if ($e.KeyCode -eq [System.Windows.Forms.Keys]::Escape) {
  23.         $form.Close()  # 关闭窗体
  24.     }
  25. })# 启动定时器以定期更新颜色$timer = New-Object System.Windows.Forms.Timer  # 创建一个新的Timer对象$timer.Interval = 50                            # 设置定时器间隔为50毫秒$timer.Add_Tick({    Update-Color -offt $script:offt})                                             # 添加Tick事件处理程序,每次触发时调用Update-Color函数$timer.Start()                                   # 启动定时器# 显示窗体[System.Windows.Forms.Application]::Run($form)  # 运行窗体应用程序的消息循环
复制代码
效果如下:
2.gif


小结

逻辑很清晰,做个屏幕保护程序,哈哈,使用PowerShell,很 纯粹 的开发体验!(不需要借助IDE、开发框架)
如果想要实现画面实时更新,就要设计一个定时器,不断执行一个函数----刷新画面功能。
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册