VB编程实现开机更换桌面背景_第1页
VB编程实现开机更换桌面背景_第2页
VB编程实现开机更换桌面背景_第3页
VB编程实现开机更换桌面背景_第4页
VB编程实现开机更换桌面背景_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VB编程实现开机更换桌面背景汪志祥(四川化工职业技术学院四川泸州 646005)摘要:本文比较全面的介绍了在Windows环境下,通过VB6.0编程调用Win32API函数来设置桌面背景的过程及方式,同时为了程序功能的完整性、易操作性及界面的友好,运用了其它的控件,并对其相应的事件过程编写了程序代码;此外还介绍了在VB中调用Win32API函数来添加和删除系统托盘图标、读写注册表的方法。关键字:Win32API函数;注册表;托盘图标;控件一、引言对于使用计算机的人来说,整天对着同样的电脑屏幕太枯燥了,一点新意都没有。能不能让计算机在每天(或每次)开机时就更换一次桌面背景呢?这个回答当然是肯定的。在这里,我用VB6.0设计一个更换桌面背景的程序,它可以通过设置在每次开机时,从一个图片文件夹中随机读取出一个图片文件,用来设置计算机的桌面背景,背景设置完后,程序可以在设置的时间(大约1分钟)后自动结束,这样又可以免除用户自己手动结束程序。二、理论实现要完成计算机桌面背景的设置,首先要明白计算机设置桌面背景的过程。计算机要将一张图片文件设置成桌面背景,首先要求图片文件是BMP格式的,如果不是BMP格式的,则要先将图片转换成BMP格式的,然后将图片文件复制到计算机的安装目录(Win9X为Windows文件夹,WinNT/2000/XP为Winnt文件夹)中——我们可以调用Win32API函数中的GetWindowsDirectory函数来获得Windows的安装目录,最后调用Win32API函数SystemParametersInfo,把图片文件设置成Windows的桌面背景。如果还要按照Windows的背景显示方式(居中、平铺、拉伸)来设置桌面背景,则在进行背景设置前,还要修改Windows注册表中“HKEY_CURRENT_USER\ControlPanel\Desktop”项下的子键“TileWallpaper”、“WallpaperStyle”的值。这两'项的值的设置如下表:显示方式TileWallpaper"WallpaperStyle居中00平铺10拉伸02要在注册表中写入这两个子键的值,我们需要调用Win32API函数中用于操作注册表的三个API函数:RegOpenKeyEx、RegSetValueEx、RegDeleteValue、RegCloseKey,分别用于完成对注册表打开,写入键值、删除子键和关闭。此外我们要求程序在计算机启动时,就要完成桌面背景的设置,这就要求程序要能随计算机启动而启动,通常的做法是在“开始”按钮的“程序”组的“启动”项中加入要启动程序的“快捷方式”。在这个程序里,我采用修改Windows注册表来完成程序的自动启动功能,即把程序的完整路径写入Windows注册表的“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”启动项中。另外,为了使程序在启动后还没有自动结束前,不影响我们的工作,我们最好能让程序在启动时就隐藏它的窗体,同时我们可能要在程序运行过程中改变程序的某些功能的设置,因此又要让程序在没有退出前,我们可以打开它的主界面进行相应的设置,在这里,我采用程序启动后产生系统托盘图标,用户在系统托盘图标上通过鼠标单击,弹出菜单进行相应的选项设置。为了完成这个功能,我们要调用Win32API函数中的Shell_NotifyIcon函数来完成托盘图标的添加、删除(程序退出前要能删除托盘图标)。最后,需要注意的就是我们用于设置桌面背景的图片文件应该是BMP格式的,这可以通过先把准备好的图片文件(JPG格式、BMP格式)装入图像控件中,再调用VB中的SavePicture方法将图片文件保存为BMP格式的。三、函数功能介绍1、 GetWindowsDirectory函数•函数功能:获得Windows安装目录•函数VisualBasic声明:PrivateDeclareFunctionGetWindowsDirectoryLib"kernel32"Alias"GetWindowsDirectoryA"(ByVallpBufferAsString,ByValnSizeAsLong)AsLong•参数:lpBuffer 指定一个字串缓冲区,用于装载Windows目录名。nSize lpBuffer字串的最大长度。•返回值:复制到lpBuffer的一个字串的长度。如lpBuffer不够大,不能容下整个字串,就会返回lpBuffer要求的长度。零表示失败。2、 SystemParametersInfo函数•函数功能:查询或设置系统及参数,在这里完成对背景的设置。•函数VisualBasic声明:DeclareFunctionSystemParametersInfoByVal&Lib"user32"Alias"SystemParametersInfoA"(ByValuActionAsLong,ByValuParamAsLong,ByVallpvParamAsAny,ByValfuWinIniAsLong)•参数:uAction指定要查询或设置的系统级参数,与桌面有关的的值为SPI_SETDESKWALLPAPER=20。uParam一般设置为0。lpvParam与查询或设置的系统级参数(uAction)有关。当uAction为SPI_SETDESKWALLPAPER时,该参数存放的是用于设置桌面背景的图片文件的文件名。fuWinIni当设置系统参数时,用来指定是否更新用户配置文件。•返回值:如果函数调用成功,则返回非0值,否则返回0值。3、 RegOpenKeyEx函数•函数功能:打开注册表中一个现有的子项。•函数VisualBasic声明:DeclareFunctionRegOpenKeyExLib"advapi32.dll"Alias"RegOpenKeyExA"(ByValhKeyAsLong,ByVallpSubKeyAsString,ByValulOptionsAsLong,ByValsamDesiredAsLong,phkResultAsLong)AsLong•参数:hKey 当前打开的项的句柄,本文使用以一两个标准许句柄:HKEY_LOCAL_MACHINEHKEY_CURRENT_USERlpSubKey 要打开的注册表子项的名称。ulOptions 未用,设置为0。samDesired 是一个掩码,用来指定访问“密级”,即指定对子项的读写操作。phkResult 用于装载打开项的名字的一个变量。•返回值:如果函数调用成功,则返回值为0否则返回一个出错代码。4、 RegSetValueEx函数•函数功能:在一个注册表项下设置一个指定值的数据和类型。•函数VisualBasic声明:DeclareFunctionRegSetValueExLib"advapi32.dll"Alias"RegSetValueExA"(ByValhKeyAsLong,ByVallpValueNameAsString,ByValReservedAsLong,ByValdwTypeAsLong,lpDataAsAny,ByValcbDataAsLong)AsLong•参数:hKey 当前打开的项的句柄,本文使用以一两个标准许句柄:HKEY_LOCAL_MACHINEHKEY_CURRENT_USERlpValueName要设置值的名称。Reserved 未用,设置为0。DwType 要设置的值的数据类型。LpData 要设置的值的数据。CbData 要设置的值的数据的长度。•返回值:如果函数调用成功,则返回值为0,否则返回一个出错代码。5、 RegDeleteValue函数•函数功能:删除指定注册表项下的一个值。•函数VisualBasic声明:DeclareFunctionRegDeleteValueLib"advapi32.dll"Alias"RegDeleteValueA"(ByValhKeyAsLong,ByVallpValueNameAsString)AsLong•参数:hKey 当前打开的项的句柄,本文使用以一两个标准许句柄:HKEY_LOCAL_MACHINEHKEY_CURRENT_USERlpValueName要删除的项的名称。•返回值:如果函数调用成功,则返回值为0,否则返回一个出错代码。6、 RegCloseKey函数•函数功能:关闭或释放打开的注册表项的句柄。•函数VisualBasic声明:DeclareFunctionRegCloseKeyLib"advapi32.dll"Alias"RegCloseKey"(ByValhKeyAsLong)AsLong•参数:hKey 要关闭的注册表项的句柄。•返回值:如果函数调用成功,则返回值为0,否则返回一个出错代码。7、 Shell_NotifyIcon函数•函数功能:向系统传送一个消息,用来添加、修改或删除任务栏状态区(系统托盘)中的图标。•函数VisualBasic声明:PrivateDeclareFunctionShell_NotifyIconLib"shell32"Alias"Shell_NotifyIconA"(ByValdwMessageAsLong,pnidAsNOTIFYICONDATA)AsBoolean•参数:dwMessage 发送的消息值。可以是下列值之一:NIM_ADD:向系统托盘区添加一个图标。NIM_DELETE:从系统托盘区删除一个图标。NIM_MODIFY:更改系统托盘图标。pnid 记录(自定义数据类型)NOTIFYICONDATA的地址,该记录的内容依赖于参数dwMessage。Shell_NotifyIcon的第二个参数是一个结构类型数据,在VisualBasic中定义为:PrivateTypeNOTIFYICONDATAcbSizeAsLonghwndAsLonguIdAsLonguFlagsAsLonguCallBackMessageAsLonghIconAsLongszTipAsString*64EndTypeNOTIFYICONDATA类型含有系统所需要的处理系统托盘区消息的信息。各成员含义如下:CbSize 记录的大小,以字节为单位。HWnd 将要接收与系统托盘区中图标有关的通知消息的窗口的句柄。UID 应用程序定义的系统托盘图标的标识符。uFlag 是一个标志数组,指明其他成员中哪一个成员含有合法数据。可以是下列值的组合:NIF_ICON:成员hIcon是合法的。NIF_MESSAGE:成员uCallBackMessage是合法的。NIF_TIP:成员szTip是合法的。uCallback_ 应用程序定义的消息标识符。系统把它作为发送到窗口(由hWnd确Message 定)的通知消息,当在图标的矩形框内发生鼠标事件时发送这些通知。HIcon 添加、更改或删除图标的句柄。SzTip 为图标显示的工具提示文本。•返回值:如果函数调用成功,返回非0值,否则返回0值。好了,基本上所有的理论工作,我们已经完成,剩余的工作就是程序界面的设计和程序代码的编写了。四、程序实现1、程序界面设计启动VB6.0新建一个工程,只要一个窗体,并在窗体放置两个框架控件、三个复选框控件、三个单选按钮控件、一个命令按钮控件、一个时钟控件、一个图像框控件和一个列表框控件。各控件在窗体上的布局如图1,各控件放置好后,将窗体调整为如图2形式,也就是程序运行时的界面了。

迥设置桌面育杲-选项 厂开机启动程序厂程序自动结束厂启动时隐藏Listl-显示方式悴居中r平铺r拉伸L迥设置桌面育杲-选项 厂开机启动程序厂程序自动结束厂启动时隐藏Listl-显示方式悴居中r平铺r拉伸L选项 厂开机启动程序厂程序自动结束r启动时隐藏-显亦方式忖居中r平備r拉伸图2控件名称属性名属性值控件名称属性名属性值FormCaptionBorderstyle设置桌面背景3-fixeddialogTimer1EnabledIntervalFalse65535FramelCaption选项Command1Caption隐藏窗体Frame2Caption显示方式Image1StretchtrueChecklCaption开机启动程序Option1CaptionIndexCaptionIndexCaptionIndex居中0平铺1拉伸2Check2Caption程序自动结束Check3Caption启动时隐藏我们再通过工程属性面板来设置各个控件的属性。各控件属性设置程序界面设计好后表:如设置好各控件的属性后,我们再用菜单编辑器完成对弹出式菜单的设计。菜单结构如下表:标题名称级别Mainmenu0visible=false显示方式mshowmode1居中mmode2index=0平铺mmode2index=1拉伸mmode2index=2-M11选项设置…moption1启动时隐藏Mstarthide1程序自动结束Mautoend1开机启动程序mstartload1退出mexit12、程序代码编写菜单设计好后,打开“API文本浏览器”将程序所要用到的所有Win32API函数及常数和结构选择出来复制到窗体模块的代码窗口中,如下:PrivateTypeNOTIFYICONDATA

cbSizeAsLonghwndAsLonguIdAsLonguFlagsAsLonguCallBackMessageAsLonghIconAsLongszTipAsString*64EndTypePrivateConstNIM_ADD=&H0PrivateConstNIM_DELETE=&H2PrivateConstNIF_MESSAGE=&H1PrivateConstNIF_ICON=&H2PrivateConstNIF_TIP=&H4PrivateConstWM_MOUSEMOVE=&H200 '鼠标消息PrivateConstWM_LBUTTONDOWN=&H201PrivateConstWM_LBUTTONUP=&H202PrivateConstWM_RBUTTONDOWN=&H204PrivateConstWM_RBUTTONUP=&H205PrivateConstSPI_SETDESKWALLPAPER=20PrivateConstSPIF_SENDWININICHANGE=&H2PrivateConstSPIF_UPDATEINIFILE=&H1PrivateConstHKEY_LOCAL_MACHINE=&H80000002PrivateConstHKEY_CURRENT_USER=&H80000001PrivateConstREG_SZ=1PrivateConstSTANDARD_RIGHTS_ALL=&H1F0000PrivateConstKEY_QUERY_VALUE=&H1PrivateConstKEY_SET_VALUE=&H2PrivateConstKEY_CREATE_SUB_KEY=&H4PrivateConstKEY_ENUMERATE_SUB_KEYS=&H8PrivateConstKEY_NOTIFY=&H10PrivateConstKEY_CREATE_LINK=&H20PrivateConstSYNCHRONIZE=&H100000PrivateConstKEY_ALL_ACCESS=((STANDARD_RIGHTS_ALLOrKEY_QUERY_VALUEOrKEY_SET_VALUEOrKEY_CREATE_SUB_KEYOrKEY_ENUMERATE_SUB_KEYSOrKEY_NOTIFYOrKEY_CREATE_LINK)And(NotSYNCHRONIZE))PrivateDeclareFunctionGetWindowsDirectoryLib"kernel32"Alias"GetWindowsDirectoryA"(ByVallpBufferAsString,ByValnSizeAsLong)AsLongPrivateDeclareFunctionSystemParametersInfoLib"user32"Alias"SystemParametersInfoA"(ByValuActionAsLong,ByValuParamAsLong,ByReflpvParamAsAny,ByValfuWinIniAsLong)AsLongPrivateDeclareFunctionRegOpenKeyExLib"advapi32.dll"Alias"RegOpenKeyExA"(ByValhKeyAsLong,ByVallpSubKeyAsString,ByValulOptionsAsLong,ByValsamDesiredAsLong,phkResultAsLong)AsLongPrivateDeclareFunctionRegSetValueExLib"advapi32.dll"Alias"RegSetValueExA"(ByValhKeyAsLong,ByVallpValueNameAsString,ByValReservedAsLong,ByValdwTypeAsLong,lpDataAsAny,ByValcbDataAsLong)AsLong

PrivateDeclareFunctionRegDeleteValueLib"advapi32.dll"Alias"RegDeleteValueA"(ByValhKeyAsLong,ByVallpValueNameAsString)AsLongPrivateDeclareFunctionRegCloseKeyLib"advapi32.dll"(ByValhKeyAsLong)AsLongPrivateDeclareFunctionShell_NotifyIconLib"shell32"Alias"Shell_NotifyIconA"(ByValdwMessageAsLong,pnidAsNOTIFYICONDATA)AsBoolean定义窗体模块中的全局变量DimsPathAsStringDimNodAsNOTIFYICONDATADimlRetAsLongDimShowModeAsIntegerDimsPathAsStringDimNodAsNOTIFYICONDATADimlRetAsLongDimShowModeAsIntegerDimRetlAsLongDimRetValAsLongDimLengthAsLongDimFnameAsStringDimTileValAsStringDimStyleValAsString'图片文件的路径'显示方式选择'显示方式的值'显示方式的值面开始程序代码的编写,在编写各事件过程之前,先选择“工程”菜单下的“引用”选项,打开“引用”对话框,将选项MicrosoftScriptingRuntime选中。PrivateSubForm_Load()DimFSOAsNewFileSystemObject'列举图片文件夹中的所有图片文件DimsFileAsFileDimsFolderAsFolderDimSysDirAsString*64'系统目录DimSysPathAsStringDimiFNumAsIntegerOnErrorGoToerrHIfApp.PrevInstanceThenEnd'检查程序的前一个实例是否已运行,避免加载相同的程序实例ModiTrayNIM_ADD,Nod'添加系统托盘图标Fname=App.Path&"\"&App.EXEName&".exe"Length=Len(Fname)+64'从注册表中读取数据用于设置各个选项ShowMode=GetSetting(App.CompanyName,App.EXEName,"showmode",0)Option1.Item(ShowMode).Value=TrueCheck3.Value=GetSetting(App.CompanyName,App.EXEName,"ShowHide",0)IfCheck3.ValueThenMe.HideCheck2.Value=GetSetting(App.CompanyName,App.EXEName,"AutoEnd",0)IfCheck2.ValueThenTimer1.Enabled=TrueCheck1.Value=GetSetting(App.CompanyName,App.EXEName,"StartLoad",0)'取得Windows的安装目录lRet=GetWindowsDirectory(SysDir,Len(SysDir))SysPath=Left(SysDir,lRet)sPath="c:\WallPaper"IfNotFSO.FolderExists(sPath)ThenFSO.CreateFoldersPathEndIf'杖举出c:\WallPaper文件夹下的所有BMP格式和JPG格式的图片文件,并将文件名添加到listl列表框中lop:SetsFolder=FSO.GetFolder(sPath)ForEachsFileInsFolder.FilesIfUCase(Right(sFile.Name,3))="BMP"OrUCase(Right(sFile.Name,3))="JPG"ThenListl.AddItemsFile.NameEndIfNextIfListl.ListCount=0ThenIfMsgBox(sPath&"文件夹中没有图像文件!"+Chr(lO)+Chr(13)+"即没有*.BMP、*.JPG、*.Gif文件!"+Chr(l0)+Chr(l3)+"是否继续读取文件!",vbYesNo+vbInformation,"提示")=vbYesThenGoTolopModiTrayNIM_DELETE,NodEndEndIf'从c:\WallPaper文件夹中随机选取一张图片来设置桌面背景RandomizeiFNum=Int(List1.ListCount*Rnd())Image1.Picture=LoadPicture(sPath&"\"&List1.List(Int(Rnd()*List1.ListCount)))SavePictureImage1.Picture,SysPath&"\BeautyWallpaper.bmp"Option1_ClickShowMode'设置背景图片的显示方式lRet=RegOpenKeyEx(HKEY_CURRENT_USER,"ControlPanel\desktop",0,KEY_ALL_ACCESS,RetVal)RegSetValueExRetVal,"TileWallpaper",0,REG_SZ,ByValTileVal,Len(TileVal)RegSetValueExRetVal,"WallpaperStyle",0,REG_SZ,ByValStyleVal,Len(StyleVal)RegCloseKeylRetSystemParametersInfoSPI_SETDESKWALLPAPER,0,ByValSysPath&"\BeautyWallpaper.bmp",SPIF_SENDWININICHANGEOrSPIF_UPDATEINIFILEerrH:EndSubPrivateSubCheck1_Click()'设置开机是否启动程序mStartLoad.Checked=IIf(Check1.Value,True,False)SaveSettingApp.CompanyName,App.EXEName,"StartLoad",Check1.ValuelRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"software\microsoft\windows\currentversion\run",0,KEY_ALL_ACCESS,RetVal)IfCheck1.ValueThenRegSetValueExRetVal,"SetWallPaper",0,REG_SZ,ByValFname,LengthElseRegDeleteValueRetVal,"SetWallPaper"EndIfRegCloseKeylRetEndSubPrivateSubCheck2_Click()'设置程序是否自动退出mAutoEnd.Checked=IIf(Check2.Value,True,False)Timer1.Enabled=IIf(Check2.Value,True,False)SaveSettingApp.CompanyName,App.EXEName,"AutoEnd",Check2.ValueEndSubPrivateSubCheck3_Click()'启动时隐藏mStartHide.Checked=IIf(Check3.Value,True,False)SaveSettingApp.CompanyName,App.EXEName,"ShowHide",Check3.ValueEndSubPrivateSubCommand1_Click()IfMsgBox("窗体是否现在立即隐藏?",vbYesNo+vblnformation,"提示")=vbYesThenMe.HideEndIfEndSubPrivateSubForm_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)弹出菜单DimmsgAsLongmsg=X/Screen.TwipsPerPixelXSelectCasemsgCaseWM_LBUTTONDOWNCaseWM_LBUTTONUPPopupMenuMainMenuCaseWM_RBUTTONDOWNCaseWM_RBUTTONUPPopupMenuMainMenuEndSelectEndSubPrivateSubForm_Terminate()'程序中断时删除系统托盘图标ModiTrayNIM_DELETE,NodEndSubPrivateSubForm_Unload(CancelAsInteger)'程序退出时删除系统托盘图标ModiTrayNIM_DELETE,NodEndSubPrivateSubmAutoEnd_Click()'通过菜单设置程序是否自动退出Check2.Value=IIf(NotmAutoEnd.Checked,Checked,Unchecked)EndSubPri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论