Delphi扩展系统菜单

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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值