分享
 
 
 

Delphi编程实现程序快捷方式[原创]

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Delphi编程实现程序快捷方式[原创]

★中共河南省济源市委党校,耿百强

摘要:本文主要介绍了用Delphi编程实现程序的快捷方式的方法,其中主要讨论了Delphi中COM编程的方法、快捷方式的实现方法,并给出了一个实例程序。

关键词:Delphi,COM编程,快捷方式

Windows系统提供了快捷方式来简化用户对应用程序的执行,尽量使得用户不与应用程序的具体位置挂上关系,大大方便了用户的操作。所以,在Windows系统下,大多安装程序一般都提供创建程序组和快捷方式。但,你有没有想过,快捷方式是如何实现的呢?

下面,我就和大家来讨论一下关于快捷方式编程实现的原理,并给大家一个具体的示例程序。

一、 编程原理

1、首先找到快捷方式的存放位置,创建程序组。

在Windows系统下,所谓的程序组就是文件夹,只是这些文件夹的存放位置比较特殊罢了,一般存放在“D:\Documents and Settings\All Users.WINNT\「开始」菜单\程序”文件夹(在Windows2000下),你可以打开这个文件夹,是不是可以看到那些以前只能在“开始-程序”中才能看到的项目?!所以,必须首先得到快捷方式的存放位置,要解决这个问题,可以有两种解决方法。

第一、通过Windows2000下的一个API函数来实现:

HRESULT SHGetSpecialFolderLocation(

HWND hwndOwner,

int nFolder,

LPITEMIDLIST *ppidl

);

第二、通过注册表来实现,打开注册表,然后依次打开“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders”,可以找到比如“开始菜单”、“程序”等文件夹的存放位置。

明白了程序组就是文件夹,要建立程序组就非常简单了,只要在找到的“程序”这个文件夹的位置中创建一个以“程序组”命名的文件夹就可以了。比如,我们把找到的“程序”所在的文件夹存放在Directory中,而程序组的名称保存在GroupName中,下面的代码可以实现在“程序”文件夹中创建“程序组”:

Directory := Reg.ReadString('Programs');

SubDir:= Directory+'\'+GroupName;

CreateDir(SubDir);

一般的应用程序都会通过API函数来实现,在本例中,我们通过第二种方法来实现。

2、创建快捷方式

解决了前面的两个小问题,我们再来看如何具体实现快捷方式的创建。如果你经常编写程序,可能会想到利用API函数来实现,不幸的是,你在API函数中找不到创建快捷方式的相应函数,因为这个功能需要用COM来实现。一些人可能会对COM编程感到陌生与恐惧,实际上,COM编程并不复杂,你不需要太了解COM就可以很好地使用它。

Windows提供了一个COM接口IshellLink,它能够帮助我们创建、修改、删除快捷方式。要使用COM接口提供的功能,必须首先调用CreateCOMObject函数创建一个接口的实例,Delphi提供了创建COM的一个基类Iunknown,具体的示例程序如下:

var

MyObject : IUnknown; file://IUnknown是COM的基类

MySLink : IShellLink; file://用于创建快捷方式的对象

MyObject := CreateCOMObject(CLSID_ShellLink);

MySLink := MyObject as IShellLink;

创建实例后,通过调用SetPath()方法设置快捷方式指向的源程序的路径,快捷方式的存储位置应该是:“程序”的位置+程序组名称+快捷方式名称+扩展名.lnk;通过SetDescription()方法设置快捷方式的描述,当然你还可以调用比如SetHotKey()等方法设置热键、显示的图标(默认为实际程序的图标)等。实际上这个接口功能远不止这些,限于篇幅,直接略过。

设置完成的快捷方式并没有保存到磁盘上,还必须通过IpersistFile对象的Save()方法来实现。如下面的代码:

MyPFIle := MyObject as IPersistFile;

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

需要注意的是:快捷方式应该使用Unicode存储,所以必须调用PWChar()函数将其转换。

二、编程示例

下面,让我们用Delphi6来编程实现一个简单的示例程序。程序的功能如下:你可以在窗口的三个文本框中输入源程序的位置(也可以通过浏览按钮来实现)、程序组名称和快捷方式名称,通过下拉框来选择快捷方式的存放位置,单击“创建”按钮可以创建程序组和快捷方式了。是不是很酷?心动不如行动,让我们一步一步来实现。

1、 启动Delphi6.0,打开一个新的标准工程。在窗体中添加所需的控件。

首先向窗体中添加四个Label对象、三个Edit对象、一个下拉框对象ComboBox1、三个Button对象和一个OpenDialog对象。依次设置其相关属性等,调整后的窗体界面如图1所示。

<P><IMG BORDER="0" SRC="http://www.jyzx.com/bbs/uploadImages/2002313434547824.jpg" WIDTH="412" HEIGHT="292"></P>

2、 向Tform1对象中新增一个函数:

function CreateShortcut(SourceFileName : string; file://源程序的位置

ShortcutName : string; file://快捷方式的名称

ShortcutLocation : ShortcutType; file://快捷方式的建立位置

SubDirectory : string file://程序组的名称

):Boolean;

其中ShortcutType是程序中自定义的一个枚举类:

type

ShortcutType=(_DESKTOP, file://桌

_STARTMENU, file://开始菜单

_PROGRAMS, file://程

_STARTUP, file://启

_QUICKLAUNCH file://快速启动栏

);

CreateShortcut()函数用于实现快捷方式和程序组的创建,如果创建成功,则返回一个真值(True),否则返回为假值(False)。这可是本文中最重要的代码段哟!

function TForm1.CreateShortcut(SourceFileName, ShortcutName: string;ShortcutLocation:ShortcutType; SubDirectory: string):boolean;

const

REG_SHELLFOLDERS =

'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders';

var

MyObject : IUnknown; file://IUnknown是基本的COM类

MySLink : IShellLink; file://用于创建快捷方式的对象

MyPFile : IPersistFile; file://用于保存快捷方式的对象

SubDir,Directory,LinkName : string;

WFileName : WideString;

Reg : TRegistry;

begin

Result:=False;

MyObject := CreateCOMObject(CLSID_ShellLink); file://建立快捷方式的COM对象

MySLink := MyObject as IShellLink;

MyPFIle := MyObject as IPersistFile;

MySLink.SetPath(pchar(SourceFileName)); file://设置快捷方式源文件的位置

Reg := TRegistry.Create ;

Reg.RootKey := HKEY_CURRENT_USER;

try

if Reg.OpenKey(REG_SHELLFOLDERS,false) then

begin

if SourceFileName<>'' then

if ShortcutName <>'' then

LinkName := ShortcutName

else

LinkName := ExtractFileName(SourceFileName)

Else file://当源路径是一个空值时,实际它指向“我的电脑”

LinkName := '我的电脑';

MySLink.SetDescription(pchar(LinkName)); file://设置快捷方式描述

LinkName := ChangeFileExt(LinkName,'.lnk'); file://修改扩展名

file://以下通过注册表得到快捷方式的实际建立位置

case ShortcutLocation of

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

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

_PROGRAMS: Directory := Reg.ReadString('Programs');

_STARTUP : Directory := Reg.ReadString('Startup');

_QUICKLAUNCH:Directory:=Reg.ReadString('AppData')+

'\Microsoft\Internet Explorer\Quick Launch'; file://快速启动栏的路径比较特殊

end;

if Directory <> '' then

begin

if SubDirectory <> '' then

begin

SubDir:=Directory + '\'+ SubDirectory;

WFileName := SubDir + '\' + LinkName ;

if not CreateDir(SubDir) then file://创建目录失败

begin

Result:=false;

Exit;

end;

end

else

WFileName := Directory + '\' + LinkName;

if MyPFile.Save(PWChar(WFileName),True)<>S_OK then

begin

Result:=False;

Exit;

end

else

Result:=true;

end

else

Result:=False;

end;

finally

Reg.Free ; file://释放空间

end;

end;

3、 编写浏览文件按钮的代码,如下:

procedure TForm1.Button1Click(Sender: TObject);

begin

if OpenDialog1.Execute then

Edit1.Text := OpenDialog1.FileName ;

end;

4、 同样的步骤编写“退出”按钮的代码:

procedure TForm1.Button3Click(Sender: TObject);

begin

Close;

end;

5、 下面是“创建”按钮的代码,直接调用我们建立的CreateShoutcut()函数来实现:

procedure TForm1.Button2Click(Sender: TObject);

var

SLinkType : ShortcutType;

begin

case ComboBox1.ItemIndex of

0 : SLinkType := _DESKTOP;

1 : SLinkType := _STARTMENU;

2 : SLinkType := _PROGRAMS;

3 : SLinkType := _STARTUP;

4 : SLinkType := _QUICKLAUNCH;

end;

if CreateShortcut(Edit1.Text ,Edit3.Text ,SLinkType, Edit2.Text ) then

Application.MessageBox(pchar('快捷方式创建成功!'),pchar('系统消息'),MB_OK)

else

Application.MessageBox(pchar('快捷方式创建失败!'),pchar('系统消息'),MB_OK);

end;

现在按下F9编译运行这个程序,你就可以试试创建快捷方式的效果了。程序的运行效果如图2:

<P><IMG BORDER="0" SRC="http://www.jyzx.com/bbs/uploadImages/20023134353019903.jpg" WIDTH="408" HEIGHT="290"></P>

当然,你还可以把程序修改后用于你的安装系统,实现个性化的安装程序,那种感觉一定酷毕了!

程序在Windows2000、Delphi6.0下编译通过。

作者:耿百强

地址:中共河南省济源市委党校

邮政编码:454650

联系电话:0391-6666267

E-Mail:dxgbq@sohu.com

OICQ:10562208

写稿日期:2002-3-12

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有