{******************************************************************************* 作者:Kingron 时间:2001.1.11 功能:用于随机的更换壁纸,能适应不同的分辨率。 联系方法:Kingron@163.net。 附注:Source.RES的建立方法: 用任意一个文本编辑器输入“SourceCode RT_RCDATA AltWallPaper.dpr”并保存 到源代码目录,然后用Delphi 5自带的Brcc32.exe进行编译即可。 *******************************************************************************} program AltWallPaper; uses windows,Sysutils,jpeg,graphics,classes,registry,messages,shlobj,comobj,Activex; const WALLPAPERFILENAME='WallPaperK.BMP'; OUTFILENAME='AltWallPaper.dpr'; APPNAME='壁纸随机更换器'; USFILENAME='\'+APPNAME+'\卸载'+APPNAME+'.lnk'; SETFILENAME='\'+APPNAME+'\参数设置.lnk'; RUNFILENAME='\'+APPNAME+'\随机更换壁纸.lnk'; PROGDIR='\'+APPNAME; REGKEY='Software\WellSoft\Wallpaper'; REGKEY1='Software\Microsoft\Windows\CurrentVersion\Run'; MSG1=' 提示:本程序不需要注册,你可以自由传播和使用这个程序,唯一的要求是' +'向作者寄一封信,如果你发现Bug也请及时报告作者以便修正。' +',但是作者不对使用本程序造成的任何损失负责!'#13 +' 联系方法:E_Mail(Kingron@163.net])'#13 +' 本程序遵守源码开放原则,如果你修改了程序,请提供本程序源代码和你修改后的代码。'#13#13 +' 您需要源代码吗?选择[是]将生成源代码文件:'+OUTFILENAME; MSG2=' 是否为程序建立快捷方式?选择[是]将在开始菜单中建立如下三个快捷方式:'#13 +'[程序]'+RUNFILENAME+#13+'[程序]'+SETFILENAME+#13+'[程序]'+USFILENAME+#13 +' 注意:如果要恢复本程序到第一次运行时的状态,请删除注册表中如下主键即可[HKEY_CURRENT_USER\'+REGKEY+']。'; type TFindCallBack=procedure (const filename:string); {$R *.RES} {$R Source.RES} var path:string; filenames:tstrings; reg:tregistry; windir:pchar; sourcecode:TResourceStream; programfolder:pchar; ppidl:pitemidlist; procedure Jpg2Bmp(const source,dest:string); var MyJpeg: TJpegImage; bmp: Tbitmap; begin bmp:=TBitmap.Create; MyJpeg:= TJpegImage.Create; try myjpeg.LoadFromFile(source); bmp.Assign(myjpeg); bmp.SaveToFile(dest); finally bmp.free; myjpeg.Free; end; end; procedure FindFile(const path: String;proc:TFindCallBack); var fpath: String; info: TsearchRec; begin if path[length(path)]<>'\' then fpath:=path+'\' else fpath:=path; try if 0=findfirst(fpath+'*',faanyfile,info) then begin if (info.Name<>'.') and (info.Name<>'..') then if (info.Attr and faDirectory)<>faDirectory then proc(fpath+info.FindData.cFileName) else findfile(fpath+info.Name,proc); while 0=findnext(info) do if (info.Name<>'.') and (info.Name<>'..') then if (info.Attr and faDirectory)<>faDirectory then proc(fpath+info.FindData.cFileName) else findfile(fpath+info.Name,proc); end; finally findclose(info); end; end; procedure Callback(const fn:string); var ext:string; begin ext:=uppercase(extractfileext(fn)); if (ext='.JPG') or (ext='.BMP') then filenames.Add(fn); end; function SelectDirectory(const Caption: string; out Directory: string): Boolean; var lpbi:_browseinfo; buf:array [0..MAX_PATH] of char; id:ishellfolder; begin result:=false; lpbi.hwndOwner:=0; lpbi.lpfn:=nil; lpbi.lpszTitle:=pchar(caption); lpbi.ulFlags:=BIF_RETURNONLYFSDIRS+BIF_STATUSTEXT; SHGetDesktopFolder(id); lpbi.pidlRoot:=nil; getmem(lpbi.pszDisplayName,MAX_PATH); if shgetpathfromidlist(shbrowseforfolder(lpbi),buf) then begin result:=true; directory:=buf; if length(directory)<>3 then directory:=directory+'\'; end; freemem(lpbi.pszDisplayName); end; function DirectoryExists(const Name: string): Boolean; var Code: Integer; begin Code := GetFileAttributes(PChar(Name)); Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0); end; procedure DeleteMe; var BatchFile: TextFile; BatchFileName: string; begin if SetFileAttributes(pchar(paramstr(0)),FILE_ATTRIBUTE_NORMAL) then begin BatchFileName := changefileext(paramstr(0),'.bat'); AssignFile(BatchFile, BatchFileName); Rewrite(BatchFile); Writeln(BatchFile, ':try'); Writeln(BatchFile, 'del "' + ParamStr(0) + '"'); Writeln(BatchFile, 'if exist "' + ParamStr(0) + '"' + ' goto try'); Writeln(BatchFile, 'del %0'); CloseFile(BatchFile); winexec(pchar(batchfilename),sw_hide); end; end; function CreateLinkFile(const sourcefilename,Arguments,DestFileName:string):boolean; var anobj:IUnknown; shlink:IShellLink; pFile:IPersistFile; wFileName:widestring; begin wFileName:=destfilename; anobj:=CreateComObject(CLSID_SHELLLINK); shlink:=anobj as IShellLink; pFile:=anobj as IPersistFile; shlink.SetPath(pchar(sourcefilename)); shlink.SetArguments(pchar(Arguments)); shlink.SetShowCmd(1); if DestFileName='' then wFileName:=ChangeFileExt(sourcefilename,'lnk'); result:=succeeded(pFile.Save(pwchar(wFileName),false)); end; procedure fitbitmap; var abmp,bbmp:tbitmap; scale:real; sx,sy:integer; begin abmp:=tbitmap.Create; bbmp:=tbitmap.Create; sx:=GetSystemMetrics(SM_CXSCREEN); sy:=GetSystemMetrics(SM_CYSCREEN); try abmp.LoadFromFile(windir+WALLPAPERFILENAME); if (abmp.Width>sx) or (abmp.Height>sy) then begin if abmp.Width/sx>abmp.Height/sy then scale:=abmp.Width/sx else scale:=abmp.Height/sy; bbmp.Width:=round(abmp.Width/scale); bbmp.Height:=round(abmp.Height/scale); bbmp.PixelFormat:=abmp.PixelFormat; SetStretchBltMode(bbmp.Canvas.Handle,COLORONCOLOR); stretchblt(bbmp.Canvas.Handle,0,0,bbmp.Width,bbmp.Height,abmp.Canvas.Handle,0,0,abmp.Width,abmp.Height,srccopy); bbmp.SaveToFile(windir+WALLPAPERFILENAME); end; finally abmp.Free; bbmp.Free; end; end; begin Getmem(programfolder,MAX_PATH); getmem(windir,MAX_PATH); getwindowsdirectory(windir,MAX_PATH); if strlen(windir)<>3 then strcat(windir,'\'); filenames:=tstringlist.Create; reg:=tregistry.Create; try if succeeded(SHGetSpecialFolderLocation(0,CSIDL_PROGRAMS,ppidl)) then if not shgetpathfromidlist(ppidl,programfolder) then begin messagebox(0,'出现未知错误!程序终止!','错误',MB_OK+MB_ICONERROR); exit; end; if paramstr(1)='/U' then if MessageBox(0,'你真的要卸载吗?','警告',MB_OKCANCEL+MB_ICONWARNING)=IDOK then begin reg:=tregistry.Create; reg.DeleteKey(REGKEY); reg.RootKey:=HKEY_LOCAL_MACHINE; if reg.OpenKey(REGKEY1,false) and reg.ValueExists(APPNAME) then reg.DeleteValue(APPNAME); reg.CloseKey; deletefile(programfolder+RUNFILENAME); deletefile(programfolder+SETFILENAME); deletefile(programfolder+USFILENAME); removedirectory(pchar(programfolder+PROGDIR)); deleteme; MessageBox(0,'成功卸载:'+APPNAME,'信息',MB_OK+MB_ICONINFORMATION); exit; end else exit; if reg.OpenKey(REGKEY,true) then begin if not reg.ValueExists('FirstRun') then begin if (MessageBox(0,MSG1,'信息',MB_YESNO+MB_ICONINFORMATION+MB_APPLMODAL)=IDYES) and selectdirectory('请选择保存源代码文件的目录:',path) then begin sourcecode:=TResourceStream.Create(hinstance,'SourceCode','RT_RCDATA'); sourcecode.SaveToFile(path+OUTFILENAME); sourcecode.Free; end; if MessageBox(0,MSG2,'安装',MB_YESNO+MB_ICONINFORMATION)=IDYES then if (CoInitialize(nil)=S_OK) and CreateDirectory(pchar(programfolder+PROGDIR),nil) then begin CreateLinkFile(paramstr(0),'/AutoRun',programfolder+RUNFILENAME); createlinkfile(paramstr(0),'',programfolder+SETFILENAME); createlinkfile(paramstr(0),'/U',programfolder+USFILENAME); CoUninitialize; end else messagebox(0,'不能建立快捷方式,可能程序已经安装了!','错误',MB_OK+MB_ICONERROR); end; path:=''; reg.WriteBool('FirstRun',true); if reg.ValueExists('Path') then begin if (paramstr(1)<>'/AutoRun') then if selectdirectory(' 更改图片文件所在(JPEG格式或者BMP格式)的目录。请更改图片目录:',path) then reg.WriteString('Path',path) else exit; Path:=reg.ReadString('Path'); if not directoryexists(path) then if selectdirectory(' 指定的图片(JPEG格式或者BMP格式)目录不存在。请另外选择一个目录:',path) then reg.WriteString('Path',path) else exit; end else if selectdirectory(' 没有定义图片文件所在(JPEG格式或者BMP格式)的目录。必须指定目录程序才能正常运行,请选择目录:',path) then reg.WriteString('Path',path) else exit; reg.CloseKey; if directoryexists(path) then begin findfile(path,Callback); if filenames.Count>0 then begin randomize; path:=filenames.Strings[random(filenames.Count)]; if Uppercase(extractfileext(path))='.JPG' then try SetFileAttributes(pchar(windir+WALLPAPERFILENAME),FILE_ATTRIBUTE_NORMAL); jpg2bmp(path,windir+WALLPAPERFILENAME); except MessageBox(0,'不能建立输出文件。'#13+'请检查文件格式是否正确或者检查磁盘!','错误',MB_OK+MB_ICONERROR); exit; end else copyfile(pchar(path),pchar(windir+WALLPAPERFILENAME),false); path:=windir+WALLPAPERFILENAME; if fileexists(path) then begin Fitbitmap; if reg.OpenKey('Control Panel\Desktop',true) then begin reg.WriteString('WallPaper',path); reg.WriteString('TileWallpaper','0'); systemparametersinfo(SPI_SETDESKWALLPAPER,0,pchar(path),0); end; end; end; end; reg.RootKey:=HKEY_LOCAL_MACHINE; if reg.OpenKey(REGKEY1,true) then reg.WriteString(APPNAME,paramstr(0)+' /AutoRun'); reg.CloseKey; end; finally filenames.Free; reg.Free; freemem(programfolder); freemem(windir); end; end.
|