使用VB中的计时器为Windows桌面背景设置动画

时间:2017-08-27 13:44:00

标签: vb.net animation timer ffmpeg visual-studio-2017

我正在处理应该使用计时器为桌面背景设置动画的代码,我使用下面的代码实现了这一点,但是我没有计划将它随机改为随机壁纸,所以这是我的问题,我是使用(ffmpeg)命令行从GIF图像中提取所有帧,然后我运行一个间隔较小的计时器(100),循环遍历所有帧并更改背景使用User32.dll API,但问题是动画不是很平滑,好像你在浏览器中打开它一样,并且在动画过程中程序会非常慢,所以我不知道是否还有另一个改变背景没有滞后的方法,这是我到目前为止所做的:

Imports System.IO

Public Class Form1
    Private Declare Auto Function SystemParametersInfo Lib "user32.dll" (ByVal X As Integer, ByVal Y As Integer, ByVal Z As String, ByVal W As Integer) As Integer
    Dim FrameX As Integer

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        'If the frame is not exist then loop from the begenning with the frame 0.
        If Not File.Exists(Application.StartupPath & "\Frames\animation" & FrameX & ".png") Then
            FrameX = 0
        End If
        Try
            SystemParametersInfo(20, 0, Application.StartupPath & "\Frames\animation" & FrameX & ".png", 1 Or 2)
        Catch ex As Exception : End Try

        FrameX += 1
        Timer1.Start()
    End Sub
End Class

1 个答案:

答案 0 :(得分:1)

我发现问题来自内存或CPU,因为函数SystemParametersInfo使用文件User32.dll文件,因此在后台和计时器中有很多处理对于该函数运行速度非常快,Windows确实在Windows XP之后删除了此功能,原因相同,RAM搞乱了所有内容,所以我使用此代码释放RAM 1}}从我的程序的使用,当我更新背景,它真的有所不同,它不完美,但它需要功能强大的PC:

首先,声明此功能:

Private Declare Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal hProcess As IntPtr, ByVal dwMinimumWorkingSetSize As Int32, ByVal dwMaximumWorkingSetSize As Int32) As Int32

二,用法:

Sub ReleaseRAM()
    Try
        GC.Collect()
        GC.WaitForPendingFinalizers()
        If Environment.OSVersion.Platform = PlatformID.Win32NT Then
            SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1)
        End If
    Catch ex As Exception
        MsgBox(ex.ToString())
    End Try
End Sub

另外,你应该在计时器的间隔和帧数上工作,如果你有这么多帧动画,间隔应该很高,所以你必须找到合适的平衡。

以管理员身份运行程序并赋予其高优先级也有帮助。

最后,希望有人会发现这个有用或有趣:)