中国石凳联盟 登录注册

【原创】【小程序】壁纸开机换

rockage··21 回复·1,065 浏览

发表回复

Option Explicit
注册表:
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Private Const HKEY_CURRENT_USER = H80000001
Private Const HKEY_LOCAL_MACHINE = H80000002
Private Const REG_SZ = 1
----------------------------------------------------------
获取Windows目录:
Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
------------------------------------------------------------
浏览文件夹
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Private Const BIF_BROWSEFORCOMPUTER = H1000
Private Const BIF_BROWSEFORPRINTER = H2000
Private Const BIF_BROWSEINCLUDEFILES = H4000
Private Const BIF_DONTGOBELOWDOMAIN = H2
Private Const BIF_EDITBOX = H10
Private Const BIF_RETURNFSANCESTORS = H8
Private Const BIF_RETURNONLYFSDIRS = H1
Private Const BIF_STATUSTEXT = H4
Private Const BIF_USENEWUI = H40
Private Const BIF_VALIDATE = H20
------------------------------------------------------------
切换当前壁纸
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long
Private Const SPI_SETDESKWALLPAPER = 20
Private Const SPIF_SENDWININICHANGE = H2
Private Const SPIF_UPDATEINIFILE = H1


Dim Arry() As String, PicCounts As Integer
Dim fso As New FileSystemObject, WinPath As String

Sub SetWallPaperReg(strNull As String)
Dim Ret2 As Long
RegOpenKey HKEY_CURRENT_USER, "Control PanelDesktop", Ret2
RegSetValueEx Ret2, "Wallpaper", 0, REG_SZ, ByVal strNull, 255 清除当前壁纸
RegCloseKey Ret2 关闭注册表句柄

End Sub

Private Sub Form_Load()
Dim s As String * 80, Length As Long

Length = GetWindowsDirectory(s, Len(s))
WinPath = Left(s, Length)

Me.Hide

If Not Command = "Start" Then

------------------------------------------------------------------------
浏览文件夹
Dim WallPath As String, Ret As Long, MyPath As String

ReSelect:
WallPath = BrowseFolder(Me.hWnd)

If WallPath = "" Then End

If GetFileList(WallPath) = True Then
SaveSetting "Wallpaper", "Set", "Path", WallPath
SaveSetting "Wallpaper", "Set", "Counts", "0"
写注册表
MyPath = App.Path "wallpaper.exe Start"
RegOpenKey HKEY_LOCAL_MACHINE, "SOFTWAREMicrosoftWindowsCurrentVersionRun", Ret
RegSetValueEx Ret, "Wallpaper Start", 0, REG_SZ, ByVal MyPath, 255 自动启动本程序
RegCloseKey Ret
SetWallPaper 设置壁纸(Count=1)
SetWallPaperReg (WinPath "WallPaper.bmp") 设置当前壁纸注册表
SystemParametersInfo SPI_SETDESKWALLPAPER, 0, WinPath "WallPaper.bmp", 0 刷新当前壁纸
SetWallPaper 设置壁纸(Count=2,以备首次设置后更改)
MsgBox "设置完毕,祝使用愉快~~"
Else
MsgBox "选择的文件夹中没有图形文件,请重新选择!"
GoTo ReSelect

End If


Else

SystemParametersInfo SPI_SETDESKWALLPAPER, 0, WinPath "WallPaper.bmp", 0 刷新当前壁纸
SetWallPaper 设置壁纸

End If

End

End Sub
Sub SetWallPaper()
Dim GV As String, GC As String, xFile As String

GV = GetSetting("Wallpaper", "Set", "Path")

If GV "" Then
If fso.FolderExists(GV) Then
If GetFileList(GV) = True Then
GC = GetSetting("Wallpaper", "Set", "Counts")
PicCounts = GC + 1
If PicCounts UBound(Arry) Then PicCounts = 1
SaveSetting "Wallpaper", "Set", "Counts", PicCounts
Set Picture1.Picture = LoadPicture(GV "" Arry(PicCounts))
xFile = WinPath "WallPaper.bmp"
SavePicture Picture1.Picture, xFile
End If LoadIt?

Else fso Check?

MsgBox "桌面墙纸文件夹已被删除或改变?请重新设置."
Me.Show

End If fso check?
End If GV?

End Sub

Function GetFileList(folder As String) As Boolean
Dim F As Object, FC As Object, Counts As Integer, F1 As Variant, F2 As String, LoadIt As Boolean
Set F = fso.GetFolder(folder)
Set FC = F.Files
Counts = 0
ReDim Preserve Arry(0)
LoadIt = False
For Each F1 In FC
F2 = UCase(Right(F1.Name, 3))
If F2 = "BMP" Or F2 = "JPG" Or F2 = "GIF" Then
Counts = Counts + 1
ReDim Preserve Arry(Counts)
Arry(Counts) = F1.Name
LoadIt = True
End If
Next

If LoadIt Then GetFileList = True Else GetFileList = False

End Function

Function BrowseFolder(Optional hWnd As Long) As String

Dim bi As BROWSEINFO
Dim pidl As Long
Dim folder As String

folder = String(255, vbNullChar)

With bi
.hOwner = hWnd
.ulFlags = BIF_RETURNONLYFSDIRS Or BIF_USENEWUI Or BIF_EDITBOX
.pidlRoot = 0
.lpszTitle = "请选择作为桌面墙纸的图片文件夹:" vbNullChar
End With

pidl = SHBrowseForFolder(bi)

If SHGetPathFromIDList(ByVal pidl, ByVal folder) Then
BrowseFolder = Left(folder, InStr(folder, vbNullChar) - 1)
Else
BrowseFolder = ""
End If
End Function

点赞0 收藏

程序功能:每次系统重启都自动从指定文件夹中挑选一张图片,并设置为桌面壁纸。

特点:1. 使用方便,所谓的操作只是选择一次图片文件夹。2. 不占用系统资源。

写这个程序的目的很简单,仅仅是我需要这么一个小东西,但是搜遍网上所有的壁纸程序都没有找到合乎要求的,大部分都需要驻留在电脑里消耗资源(哪怕很少),我需要的功能很简单,仅仅是每次开机自动换一次壁纸,并且我认为完成如此简单的功能一定能做到零系统资源占用率!em7:

------------------------------------------------------

真正做起来的时候并不是想象中那么容易,首先解决注册表的问题,涉及三个API:

RegOpenKey 打开一个主键,并返回该主键的操作句柄。

RegSetValueEx 设置指定项目的值,如之前没有这个项目,则创建它

RegCloseKey 关闭一个主键

HKEY_LOCAL_MACHINE 常数,定义为Local_Machine根键

HKEY_CURRENT_USER 常数,定义为Local_User根键

注册表的基本操作流程是:

1. 使用RegOpenKey打开一个主键并得到这个主键的操作句柄 :

例:RegOpenKey HKEY_LOCAL_MACHINE, "SOFTWAREMicrosoftWindowsCurrentVersionRun", Ret
打开根键“HKEY_LOCAL_MACHINE”的“SOFTWAREMicrosoftWindowsCurrentVersionRun”,将注册表句柄返回到变量Ret上(注意这跟一般由函数本身返回值有所不同,这个函数的返回值在函数的形式参数中)

成功得到这个主键的句柄之后,就可以对这个主键进行操作了:

2. 使用RegSetValueEx设置一个键值:

例:RegSetValueEx Ret, "Wallpaper Start", 0, REG_SZ, ByVal MyPath, 255
变量Ret是上面求得的"SOFTWAREMicrosoftWindowsCurrentVersionRun" 的句柄,对这个句柄进行操作等于就是对“SOFTWAREMicrosoftWindowsCurrentVersionRun”这个主键进行操作,此例在这个主键里设置一个项目,名为“Wallpaper Start”,项目值设为MyPath,255表示MyPath允许的最大长度。众所周知,SOFTWAREMicrosoftWindowsCurrentVersionRun这个主键里的项目都是随Windows启动自动运行的程序,我们将程序放入里面,表示本程序每次随系统自动运行。

3. RegCloseKey,这个函数功能及其简单,作用是释放一个注册表句柄所占用的系统内存。

------------------------------------------------------

二. 获取Windows安装路径:

1. GetWindowsDirectory
方法:
Dim s As String * 80, Length As Long
Length = GetWindowsDirectory(s, Len(s))
WinPath = Left(s, Length)
我们每次启动都调用C:WindowsWallpaper.bmp,程序每次都改变这个图片的内容,达到切换的效果。

------------------------------------------------------

三. 打开“浏览文件夹”对话框
其实利用CommonDialog控件更容易些,但是没有必要在如此简单的程序里使用这个庞然大物,并且我们只是需要开一个对话框并不需要别的窗口,所以采用API是最好的办法。

1. SHBrowseForFolder 显示一个“浏览文件夹”对话框
2. SHGetPathFromIDList 返回 “浏览文件夹”对话框所获取的值
方法:

pidl = SHBrowseForFolder(bi) bi是一个BROWSEINFO结构,此结构具体成员如下:

With bi
.hOwner = hWnd
(本对话框所有者句柄,本程序里就是主窗体的句柄me.Hwnd)
.ulFlags = BIF_RETURNONLYFSDIRS Or BIF_USENEWUI Or BIF_EDITBOX
(本对话框的窗口类型定义,不同的类型用OR连接)
.pidlRoot = 0
(初始的路径定义,这个值必须使用数字标识,我们这个程序没有用到这个功能,那么简单的把它设为0,则初始路径为桌面)
.lpszTitle = "请选择作为桌面墙纸的图片文件夹:" vbNullChar
(本对话框的提示语)
End With

SHGetPathFromIDList(ByVal pidl, ByVal folder)
返回用户所选择的路径,返回值是字符串。

------------------------------------------------------

四. 即时刷新桌面

1. SystemParametersInfo,这个函数其实作用非常强大,可以设置Windows里的许多项目,刷新桌面只是其中一个很小的部分。
用法:
SystemParametersInfo SPI_SETDESKWALLPAPER, 0, WinPath "WallPaper.bmp", 0
刷新当前壁纸,大家一定知道Windows 设置了桌面后,实际上桌面并没有发生变化,必须点一下旁边的“应用”或“确定”按钮,桌面才会即时刷新,虽然我们改变了注册表中系统桌面的路径,但必须刷新一次才能看到效果。

注意!SystemParametersInfo只接受BMP图片,实际上在未打开Active X桌面的前提下Windows 也只支持BMP图片,我们平时用JPG图片为桌面,系统在后台都被自动转换成了BMP格式。为此,我们必须放一个Picture Box,然后先Load一个JPG,再Save成BMP图片。
方法:
Set Picture1.Picture = LoadPicture(GV "" Arry(PicCounts))
装载指定文件名
xFile = WinPath "WallPaper.bmp"
设置目标文件名
SavePicture Picture1.Picture, xFile
存盘

------------------------------------------------------

五. 关于VB程序和命令行的关系

本程序有两种运行模式,第一种为默认运行,直接双击鼠标,这个程序将会进入设置界面,第二种为带参数运行,在这个模式下,程序并不显示任何界面,只是为下次启动提供不同的图片而已,这样做的好处是:同一个程序,不同的运行方式,那么我们就无需再为这个程序提供一个专门的“设置界面”。 方法很简单:启动程序.EXE 参数,例如:

Wallpaper.exe Start

在程序里,这个"Start"可以用Command来获取,例如:

If Not Command = "Start" Then 如果初始命令不是"Start"的话,则按默认运行模式处理。

实际上,我们放在“自启动”注册表里的正是“Wallpaper.exe Start”,而如果我们用鼠标启动,那么自然是不带任何参数的(即Command="")

------------------------------------------------------

六. 关于FSO的使用

在“工程-引用”里添加一个“MicroSoft Scripting Runtime”类库,即可使用强大的File System Object(文件系统对象)
FSO有很多功能,基本能完成一般的文件操作。我们现在只需要它其中一个:获取指定文件夹的文件列表。

方法:
Set F = fso.GetFolder(folder)
设置F为FSO里的Folder(文件夹对象)
Set FC = F.Files
设置FC为F里的File(文件对象)

Counts = 0
ReDim Preserve Arry(0)
Arry为存放文件名的字符串数组

LoadIt = False
For Each F1 In FC
F2 = UCase(Right(F1.Name, 3))
If F2 = "BMP" Or F2 = "JPG" Or F2 = "GIF" Then
非BMP,JPG,GIF文件不收录
Counts = Counts + 1
ReDim Preserve Arry(Counts)
重新定义Array的上标,以让它放更多的东西
Arry(Counts) = F1.Name

LoadIt = True
End If
Next

------------------------------------------------------

七. 程序基本流程

默认模式:
1. 判断Command是否为“空”以确认是否默认模式
2. 如果参数是空,则打开文件夹浏览对话框,让用户选择他指定的图片文件夹
3. 指定文件夹路径存入注册表,修改Windows默认的桌面图片地址为C:WindowsWallpaper.bmp
4. 将计数器置为1,并存入注册表
5. Load第一副图片,将它存为C:WindowsWallpaper.bmp,并用函数SystemParametersInfo刷新
6. 退出程序

启动模式:
1. 判断Command是否为“Start”以确认是否启动模式
2. 如果参数是"Start",则隐含主界面
3. 读取注册表里的计数器值并加1
4. 得到下一副图片,并存为C:WindowsWallpaper.bmp
5. 退出程序

实际上,在本程序的控制下,系统每次都会去读取C:WindowsWallpaper.bmp为桌面,而同时,本程序又不断修改C:WindowsWallpaper.bmp的内容,变的只是文件的内容,而不是文件名。而因为每次都退出了程序,所以本程序只是在系统启动的时候运行一下,随后立刻退出,实现了不占用系统资源的目的。


Written By Rockage
2006.3.15 AM1:50

程序+源代码 下载:




http://www.stoneren.com/dvbbs/Wallpaper.rar



点赞0 收藏

怎么用的,我试了试2k系统中直接双击运行不会出现设置界面,是不是要把这个程序放到启动中?还是放到哪去?具体使用方法好像都没有,还有就是程序从哪读取用户想用的图片,图片的路径因该怎么设置的?放哪个盘,哪个目录下?
Being a devil is the same as being a human. We should be kind. If we are kind, we are not a devil, we are a hybrid.
点赞0 收藏

我日,rockages.com空间有问题,传上去的.exe文件下载回来就乱套,传上去的rar文件下载回来报CRC错误。

东西已搬至stoneren.com
点赞0 收藏

设置完以后以后每次重启会自动运行了吧
Being a devil is the same as being a human. We should be kind. If we are kind, we are not a devil, we are a hybrid.
点赞0 收藏
BN呀
Being a devil is the same as being a human. We should be kind. If we are kind, we are not a devil, we are a hybrid.
点赞0 收藏
华哥好像又升华了
Being a devil is the same as being a human. We should be kind. If we are kind, we are not a devil, we are a hybrid.
点赞0 收藏
有bug啦,你也知道的啦,快更新
Being a devil is the same as being a human. We should be kind. If we are kind, we are not a devil, we are a hybrid.
点赞0 收藏

偶用番茄園的繫統,又自帶的“壁紙自動換”

嘿嘿……

哦。大使一般用什么軟件加殼啊 ?
推动世界这部水车运转的水浪,发源于人迹罕至的地方。

点赞0 收藏

問閣下一般什么工具給軟件加殼!
推动世界这部水车运转的水浪,发源于人迹罕至的地方。

点赞0 收藏
发表回复
发表回复