我正在处理应该使用计时器为桌面背景设置动画的代码,我使用下面的代码实现了这一点,但是我没有计划将它随机改为随机壁纸,所以这是我的问题,我是使用(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
答案 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
另外,你应该在计时器的间隔和帧数上工作,如果你有这么多帧动画,间隔应该很高,所以你必须找到合适的平衡。
以管理员身份运行程序并赋予其高优先级也有帮助。
最后,希望有人会发现这个有用或有趣:)