hkey_classes_root\folder\shell 可修改对任意文件夹单
击右键弹出的菜单的菜单项
hkey_classes_root\directory\shell 可修改对任意目录单击
右键弹出的菜单的菜单项
hkey_classes_root\drive\shell 可修改对任意驱动器单
击右键弹出的菜单的菜单项
hkey_classes_root\*\shell 可修改对任意文件单击右
键弹出的菜单的菜单项
delphi中提供的tregistry类来对注册表进行操作。tregistry常用的
属性和方法有:
rootkey属性:表示当前所在的根键。(注册表公又六个根键)
openkey方法:用于打开一个键,如果该键不存在则先创建它后
打开它。
openkeyreadonly方法:也是用于打开一个键,但如果打开的键不存在
则返回 false。
createkey方法:用于创建新的键。
readstring:从表中读取字符串,相应的有readintger等方法。
writestring:往表中写入字符串。相应的还有writeintger的方法。
关于tregistry的详细的属性和方法请看联机帮助(先选定tregistry
在按f1键即可)。注意tregistry在registry.pas单元,故调用时,要在
user下加入“registry”。
好了,理论的东西讲了差不多了,现在该打开deiphi了。打开delphi
新建一工程,在窗体中添加两个按钮,属性分别设为:
name caption
button1 添加到系统菜单
button2 退出应用程序
我们的程序很简单,就是按下“添加到系统菜单”按钮时,将程序像
winzip一样添加到系统菜单中去,当你在系统菜单中单击“我的程序”
时,我们的程序就启动。
在user下键入:registry 即如下
uses
windows, messages, sysutils, classes, graphics, controls, forms,
dialogs,registry;
找到
var
form1: tform1; 在其下加入: reg:tregistry;
双击form1,在formcreate事件中加入:
reg:=tregistry.create ;
reg.rootkey:=hkey_classes_root;
reg.openkey ('\folder\shell\mysoft',true);
注意,定义了reg后,要用tregistry.create来创建它。这里我们将
其根键指到hkey_classes_root,因为我们要在任意文件夹单击右键时
在弹出的菜单中有我们的程序名,故选择folder\shell键,然后用openkey
创建并打开mysoft子键,这里mysoft是任意命名的。
双击button1在button1click中加入如下代码:
reg.writestring ('','我的程序');
reg.createkey ('command');
reg.openkeyreadonly ('\folder\shell\mysoft\command');
reg.writestring('','我的程序.exe');
我们现在mysoft子键下写入键值“我的程序”,这几个字就是在系统
菜单中出现的字。可随意命名。然后在mysoft子键下创建新键“command”
注意,必须是“command”不能随便该名。然后在其下写入键值“我的程序.exe”
这个键值是你想让系统打开的程序,这里我们将它指到我们的程序(呵呵
注意,在程序编译成可执行文件是,要将程序名改为“我的程序”)
最后,注意要将reg占用的空间释放掉,故在formclose事件中加入:
reg.free ;
呵呵,好了,程序基本上以完工,按下f9键,单击“添加到系统菜单”,
然后,对着任意文件夹单击右键,是不是发现菜单中有一项“我的程序”
啊?选定该项是不是弹出一个对话框,表示找不到程序。呵呵,那是你没有
将你的 程序改名为“我的程序”,赶快改名,看,现在什么样了:)
当然,这个还有点bug,就是打开程序时,不知道程序是否以修改了注册表
因而,我们再为程序添加一项功能,当注册表以被修改,则启动程序时
button1变灰变成不可用,这样,就避免了在次修改注册表,因而formcreate
事件的代码应改为:
reg:=tregistry.create ;
reg.rootkey:=hkey_classes_root;
if reg.openkeyreadonly ('\folder\shell\mysoft') then
begin
button1.enabled :=false;
exit;
end;
reg.openkey ('\folder\shell\mysoft',true);
这样,我们所要实现的功能就实现了,:-p
再按下f9看看效果吧。
程序在windows98+delphi5.5中调试通过。
////////////////////添加上关联程序和注册表部分
reg:=tregistry.create ;
try
reg.rootkey:=hkey_classes_root;
if not reg.openkeyreadonly ('\*\shell') then
begin
reg.openkey ('\*',true);
reg.createkey ('shell');
end;
if not reg.openkeyreadonly ('\folder\shell') then
begin
reg.openkey ('\folder',true);
reg.createkey ('shell');
end;
finally
reg.Free;
end;
reg:=tregistry.create ;
try
reg.rootkey:=hkey_classes_root;
if not reg.openkeyreadonly ('\folder\shell\ugvanxk') then
begin
if reg.openkey ('\folder\shell\ugvanxk',true)then
begin
reg.writestring ('','article');
reg.createkey ('command');
end;
if reg.openkey('\folder\shell\ugvanxk\command',true) then
reg.writestring('',Application.ExeName+quotedstr('%1'));
end;
finally
reg.Free;
end;
reg:=tregistry.create ;
try
reg.rootkey:=hkey_classes_root;
if not reg.openkeyreadonly ('\*\shell\ugvanxk') then
begin
if reg.openkey ('\*\shell\ugvanxk',true) then
begin
Application.ProcessMessages;
reg.writestring ('','article');
reg.createkey ('command');
end;
if reg.openkey('\*\shell\ugvanxk\command',true)then
reg.writestring('',Application.ExeName+quotedstr('%1'));
end;
finally
reg.Free;
end;
//////////////////////////////////////参数获得///////////////////////////
var
paramName:string;
begin
Application.Initialize;
if ParamCount>1 then Exit;
if ParamCount=0 then
begin
Application.Title := '关闭服务程序';
Application.CreateForm(TKillSrvF, KillSrvF);
end else
begin
paramName:=LowerCase(ParamStr(1));
EnableDebugPrivilege;
KillTask(paramName);
end;
Application.Run;