网页功能: 加入收藏 设为首页 网站搜索  
壁纸随机更改
发表日期:2003-05-28作者:[] 出处:  

{*******************************************************************************

 作者: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.

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 壁纸随机更改
本类热点文章
  DBGrid 应用全书
  DBGrid 应用全书
  TWebBrowser编程简述
  用户界面设计的技巧与技术
  用户界面设计的技巧与技术
  初探Delphi 7 中的插件编程
  获取主板BIOS的信息
  网卡的远程网络唤醒
  Delphi 2006简介(Dexter)
  用Delphi开发数据库程序经验三则
  Delphi面向对象编程的20条规则
  Delphi面向对象编程的20条规则
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00507