打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
让Delphi程序更方便地启动
让Delphi程序更方便地启动
发布时间:2008-04-02 17:07:49  来源:编程爱好者网站
  一般情况下,程序在安装时,要进行建立自己的程序组和程序项、在桌面上建立快捷方式、 
  让程序随Win9X/NT自动启动、把程序快捷方式放入快速启动工具栏等工作,其目的就 
  是让用户更容易、更方便运行自己的程序,从而且增加程序的友好性。下面我们就讨论一下在 
  DELPHI程序如果实现这四项操作。 
   
  一、建立自己的程序组和程序项 
    1、实现原理 
      建立自己的程序组,就是在WINDOWS目录下的子目录Start Menu\Programs下, 
  建立一个子目录;建立程序项,就是在该子目录下建立程序的快捷方式。 
    2、建立程序的快捷方式 
      由于建立自己的程序组和程序项、在桌面上建立快捷方式、把程序快捷方式放入快速 
  启动工具栏三个操作中要用到建立程序快捷方式的操作,首先来讨论一下 如何在DELPHI 
  程序中建立程序快捷方式。 
      在手工建立程序的快捷方式时,通常要指定程序的文件名称和运行参数;在程序中建 
  立程序的快捷方式时还要指定程序的工作目录。我们可以用ShlObj单元中COM对象IShellLink 
  来指定程序的文件名称、运行参数和程序的工作目录三个参数,然后用COM对象IPersistFile 
  来保存快捷方式文件。具体的实现步骤请参见下面程序函数和注释。 
      我们要用到的操作是在指定目录下建立指定程序的快捷方式,因而要指定快捷文件要 
  保存的目录。 
   
  { 建立程序的快捷方式,程序文件名称为strExeFileName,运行参数为strParameters, 
  快捷方式所在目录为strPath,返回值为True表示成功建立快捷方式,请在单元包含中增加 
  ComObj, ShlObj, ActiveX三个单元 } 
  function CreateShortcut( strExeFileName, strParameters, strPath : string ) : boolean; 
  var 
   strLnkFileName : widestring;//程序的快捷方式文件名称 
   shelllinkTemp : IShellLink; 
   persistfileTemp : IPersistFile; 
  begin 
   //设置快捷方式的参数 
   shelllinkTemp := IShellLink( CreateComObject(CLSID_ShellLink)); 
   with shelllinkTemp do 
   begin 
   SetPath( PChar( strExeFileName ) ); //设置程序文件全名 
   SetArguments( PChar( strParameters) );//设置程序的命令行参数 
   //设置程序的工作目录 
   SetWorkingDirectory( PChar( ExtractFilePath( strExeFileName ) ) ); 
   end; 
   
   //构造快捷方式的文件名(.LNK),路径采用指定目录,文件名为程序文件名,扩展名为LNK 
   //路径采用指定目录,文件名为程序文件名 
   strLnkFileName := strPath + '\' + ExtractFileName( strExeFileName ); 
   //替代文件扩展名 
   strLnkFileName := copy( strLnkFileName,1, length( strLnkFileName ) - 
   length( ExtractFileExt( strExeFileName ) ) ) 
   + '.LNK'; 
   //保存快捷方式的文件 
   persistfileTemp := shelllinkTemp as IPersistFile; 
   if S_OK = persistfileTemp.Save( PWChar( strLnkFileName ) , false ) then 
   result := true //保存成功,返回True 
   else result := false;//保存失败,返回False 
  end; 
   
    3、建立自己的程序组和程序项 
  { 创建程序组和程序项 } 
  procedure TForm1.Button2Click(Sender: TObject); 
  begin 
   //创建程序组MyGroup,即在C:\PWINArray8\Start Menu\Programs下建立子目录MyGroup 
   if not DirectoryExists( 'C:\PWINArray8\Start Menu\Programs\MyGroup' ) then 
   ForceDirectories( 'C:\PWINArray8\Start Menu\Programs\MyGroup' ); 
   //创建程序项,在该子目录下建立程序的快捷方式 
   if CreateShortcut( 'C:\Program Files\Borland\Dbd\Dbd32.exe','%1', 
   'C:\PWINArray8\Start Menu\Programs\MyGroup' ) then 
   memo1.lines.add( '创建程序组和程序项成功' )//创建程序组和程序项成功 
   else//创建程序组和程序项失败 
   memo1.lines.add( '创建程序组和程序项失败' ); 
  end; 
   
  二、在桌面上建立程序的快捷方式 
    1、实现原理 
      在桌面上建立程序的快捷方式,就是在WINDOWS目录下的子目录Desktop下 
  建立程序的快捷方式。 
    2、在桌面上建立程序的快捷方式 
  { 在桌面上建立程序的快捷方式 } 
  procedure TForm1.Button1Click(Sender: TObject); 
  begin 
   //在目录C:\PWINArray8\Desktop下建立程序的快捷方式 
   if CreateShortcut( 'C:\Program Files\Borland\Dbd\Dbd32.exe','%1', 
   'C:\PWINArray8\Desktop' ) then//创建桌面快捷方式成功 
   memo1.lines.add( '创建桌面快捷方式成功' ) 
   else//创建桌面快捷方式失败 
   memo1.lines.add( '创建桌面快捷方式失败' ); 
  end; 
   
  三、让程序随Win9X/NT自动启动 
    让程序随Win9X/NT自动启动,可以把程序的快捷方式放到“启动”程序组中, 
  不过这并不是一个好办法。较好的办法是修改系统注册表,在其中加入程序文件的名称及 
  运行参数。 
    1、实现原理 
      让程序随Win9X/NT自动启动,可以在注册表的HKEY_LOCAL_MACHINE\Software 
  \Microsoft\Windows\CurrentVersion\Run中加入程序文件的名称及运行参数,使程序作为一般 
  程序随Win9X/NT自动启动;或在HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsCurrentVersion\RunOnce中加入程序文件的名称及运行参数,使程序作为服务程序随Win9X 
  /NT自动启动,这样按Ctrl+Alt+Del时,任务列表中将不会列出该程序的有关信息。 
    2、让程序随Win9X/NT自动启动 
  { 让自己的程序随WINArray5/Array8/NT的启动而运行,请在单元包含中增加Registry单元 } 
  procedure TForm1.Button3Click(Sender: TObject); 
  var 
   registerTemp : TRegistry; 
   success : boolean; 
  begin 
   registerTemp := TRegistry.Create; //建立一个Registry实例 
   with registerTemp do 
   begin 
   RootKey:=HKEY_LOCAL_MACHINE;//设置根键值为HKEY_LOCAL_MACHINE 
   //找到Software\Microsoft\Windows\CurrentVersion\Run 
   if OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',True) then 
   //写入自己程序的快捷方式信息 
   begin 
   WriteString( 'DBD', 'C:\Program Files\Borland\Dbd\Dbd32.exe' ); 
   success := true;//设置程序自动启动成功 
   end 
   else success := false;//设置程序自动启动失败 
   //善后处理 
   CloseKey; 
   Free; 
   end; 
   if success then memo1.lines.add( '设置程序自动启动成功' ) 
   else memo1.lines.add( '设置程序自动启动失败' ); 
  end; 
   
  四、把程序快捷方式放入快速启动工具栏 
    WindowsArray5/Array8的任务栏是桌面上的一个特殊区域,用于显示“开始”菜单、时钟等以及 
  目前执行的任务。WindowsArray8的任务栏增加了快速启动工具栏,将程序的快捷方式放在任务栏 
  的“快速启动”区,可以更方便地启动程序,以免在开始菜单中一级级地查找或关闭窗口在 
  桌面上启动程序。 
    WindowsArray8 安装后缺省的快速启动工具栏包含“显示桌面”、“IE 浏览器”等。如果快 
  速启动工具栏已关闭,可用鼠标右键单击任务栏的空白区域,单击“工具栏”,确认已选中 
  “快速启动”即可打开。 
    1、实现原理 
      把程序快捷方式放入快速启动工具栏,就是在WINDOWS目录下的子目录 
  Application Data\Microsoft\Internet Explorer\Quick Launch下建立程序的快捷方式。 
    2、把程序快捷方式放入快速启动工具栏 
  { 将程序快捷方式加入快速启动工具栏 } 
  procedure TForm1.Button4Click(Sender: TObject); 
  begin 
   //将程序快捷方式加入快速启动工具栏 
   if CreateShortcut( 'C:\Program Files\Borland\Dbd\Dbd32.exe','%1', 
   'C:\PWINArray8\Application Data\Microsoft\Internet Explorer\Quick Launch' ) 
   then//成功 
   memo1.lines.add( '将程序快捷方式加入快速启动工具栏成功' ) 
   else//失败 
   memo1.lines.add( '将程序快捷方式加入快速启动工具栏失败' ); 
  end; 
   
    以上程序在PWINArray8+DELPHI3.0下调试通过。 
  (作者:深圳王发军 wangfajun@163.net http://wangfajun.163.net)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
interface



uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Registry, ActiveX, ComObj, ShlObj;



type

ShortcutType = (_DESKTOP, _QUICKLAUNCH, _SENDTO, _STARTMENU, _OTHERFOLDER);



TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;



var

Form1: TForm1;



implementation



{$R *.dfm}



function CreateShortcut(SourceFileName: string; // the file the shortcut points to

Location: ShortcutType; // shortcut location

SubFolder, // subfolder of location

WorkingDir, // working directory property of the shortcut

Parameters,

Description: string): // description property of the shortcut

string;

const

SHELL_FOLDERS_ROOT = 'Software\MicroSoft\Windows\CurrentVersion\Explorer';

QUICK_LAUNCH_ROOT = 'Software\MicroSoft\Windows\Current\Version\GrpConv';

var

MyObject: IUnknown;

MySLink: IShellLink;

MyPFile: IPersistFile;

Directory, LinkName: string;

WFileName: WideString;

Reg: TRegIniFile;

begin



MyObject := CreateComObject(CLSID_ShellLink);

MySLink := MyObject as IShellLink;

MyPFile := MyObject as IPersistFile;



MySLink.SetPath(PChar(SourceFileName));

MySLink.SetArguments(PChar(Parameters));

MySLink.SetDescription(PChar(Description));



LinkName := ChangeFileExt(SourceFileName, '.lnk');

LinkName := ExtractFileName(LinkName);



// Quicklauch

if Location = _QUICKLAUNCH then

begin

Reg := TRegIniFile.Create(QUICK_LAUNCH_ROOT);

try

Directory := Reg.ReadString('MapGroups', 'Quick Launch', '');

finally

Reg.Free;

end;

end

else

// Other locations

begin

Reg := TRegIniFile.Create(SHELL_FOLDERS_ROOT);

try

case Location of

_OTHERFOLDER : Directory := SubFolder;

_DESKTOP : Directory := Reg.ReadString('Shell Folders', 'Desktop', '');

_STARTMENU : Directory := Reg.ReadString('Shell Folders', 'Start Menu', '');

_SENDTO : Directory := Reg.ReadString('Shell Folders', 'SendTo', '');

end;

finally

Reg.Free;

end;

end;



if Directory <> '' then

begin

if (SubFolder <> '') and (Location <> _OTHERFOLDER) then

WFileName := Directory + '' + SubFolder + '' + LinkName

else

WFileName := Directory + '' + LinkName;



if WorkingDir = '' then

MySLink.SetWorkingDirectory(PChar(ExtractFilePath(SourceFileName)));



MyPFile.Save(PWChar(WFileName), False);

Result := WFileName;

end;

end;



function GetProgramDir: string;

var

reg: TRegistry;

begin

reg := TRegistry.Create;

try

reg.RootKey := HKEY_CURRENT_USER;

reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', False);

//Result := reg.ReadString('Programs'); //放在程序组

Result := reg.ReadString('Startup'); //防在启动里

reg.CloseKey;

finally

reg.Free;

end;

end;



procedure TForm1.Button1Click(Sender: TObject);

const

PROGR = 'c:Setup.exe';

var

resPath: string;

begin

{ //Create a Shortcut in the Quckick launch toolbar

CreateShortcut(PROGR, _QUICKLAUNCH, '','','','Description');}



//Create a Shortcut on the Desktop

CreateShortcut(PROGR, _DESKTOP, '','','','Description');



//Create a Shortcut in the Startmenu /"Programs"-Folder

{ resPath := CreateShortcut(PROGR, _OTHERFOLDER, GetProgramDir,'','','快捷方式试验');

if resPath <> '' then

begin

ShowMessage('Shortcut Successfully created in: ' + resPath);

end;}

end;



end.

建议:

取得系统里的DESKTOP, QUICKLAUNCH, SENDTO, STARTMENU这些特殊目录的路径不用读注册表那么麻烦,
好像用SHGetspeciaFolderLocation和 SHGetPathFromIDList这两个API函数方便多了,关键要用到一些以CSIDL_打头的常量。
这两个函数可以获得操作系统里很多特殊目录 的路径,极方便
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
delphi注册表操作(读取、添加、删除、修改)完全手册 (2)
完美解决OFFICE2003与OFFICE2007共存
IT天空优启通(U盘PE制作助手)制作U盘PE启动图文教程
如何控制其他程序窗体上的窗口控件:上
在DELPHI程序中拨号上网
用Delphi实现开机自动启动程序_delphi 开机自动启动
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服