孤独客 发表于 2005-5-28 20:05:00

版主,请您帮个忙,告诉我怎样把菜单组加入注册表的


你就以2002做个例子吧


小弟先谢谢你了


小弟急需

秋枫 发表于 2005-5-28 21:33:00

将菜单组加入注册表一般用LISP或VBA实现比较保险。我的新的安装程序并不做这个工作。直接修改注册表的做法我只能给你一个Delphi的例子,仅供参考:procedure RemoveMenuGroup(const AutoCADProductKey, MenuGroup:String);
var Profiles: TStringList;
       MenuGroupValues: TStringList;
       i,j:integer;
       MenuGroupFound: boolean;
       Reg: TRegistry;
begin
   MenuGroupFound:=false;
   Profiles:= TStringList.Create;
   MenuGroupValues := TStringList.Create;
   Reg:=TRegistry.Create;
   try
       Reg.RootKey := HKCU;
       Reg.OpenKey(AutoCADProductKey+'\Profiles', false);
       Reg.GetKeyNames(Profiles);
       Reg.CloseKey;
       for i := 0 to Profiles.Count-1 do
       begin
         if Reg.KeyExists(AutoCADProductKey+'\Profiles\'+Profiles+'\Menus') then
         begin
               MenuGroupValues.Clear;
               Reg.OpenKey(AutoCADProductKey+'\Profiles\'+Profiles+'\Menus', true);
               j := 1;
               While Reg.ValueExists('Group'+IntToStr(j)) do
               begin
                   MenuGroupValues.Add(Reg.ReadString('Group'+IntToStr(j)));
                   inc(j);
               end;
               for j := MenuGroupValues.Count - 1 downto 0 do
               begin
                   if UpperCase(MenuGroupValues) = UpperCase(MenuGroup) then
                   begin
                     MenuGroupValues.Delete(j);
                     MenuGroupFound:=true;
                   end;
               end;
               If MenuGroupFound then
               begin
                   j:=1;
                   While Reg.ValueExists('Group'+IntToStr(j)) do
                   begin
                     Reg.DeleteValue('Group'+IntToStr(j));
                     inc(j);
                   end;
                   for j := 0 to MenuGroupValues.Count -1 do
                   begin
                     Reg.WriteString('Group'+IntToStr(j+1), MenuGroupValues);
                   end;
               end;
               Reg.CloseKey;
         end;
       end;
   finally
       Profiles.Free;
       MenuGroupValues.Free;
       Reg.Free;
   end;
end;
procedure AddMenuGroup(const AutoCADProductKey, MenuGroup:String);
var Profiles: TStringList;
       i,j:integer;
       Reg: TRegistry;
begin
   RemoveMenuGroup(AutoCADProductKey, MenuGroup);
   Profiles:= TStringList.Create;
   Reg := TRegistry.Create;
   try
       Reg.RootKey := HKCU;
       Reg.OpenKey(AutoCADProductKey+'\Profiles', false);
       Reg.GetKeyNames(Profiles);
       Reg.CloseKey;
       for i := 0 to Profiles.Count-1 do
       begin
         if Reg.KeyExists(AutoCADProductKey+'\Profiles\'+Profiles+'\Menus') then
         begin
               Reg.OpenKey(AutoCADProductKey+'\Profiles\'+Profiles+'\Menus', true);
               j:=1;
               While Reg.ValueExists('Group'+IntToStr(j))
                           and (Reg.ReadString('Group'+IntToStr(j)) <> '') do inc(j);
               Reg.WriteString('Group'+IntToStr(j), MenuGroup);
               Reg.CloseKey;
         end;
       end;
   finally
       Profiles.Free;
       Reg.Free;
   end;
end;

孤独客 发表于 2005-5-29 00:15:00

要是用lisp修改注册表


怎么才能让autocad在启动时就加载菜单组啊?


比如你以前提供的文字修改大师中ctt.mns


怎么使autocad       在启动时就加载他呢?


谢谢你

秋枫 发表于 2005-5-29 15:00:00

用vlisp的话,不需要修改注册表。


用(command "menuload" ...)即可。我提供的样例程序中有详细的例子。

孤独客 发表于 2005-5-29 18:52:00

我想在打开autocad时就自动加载菜单,就和你哪个安装程序一样


如果我用vlisp写的话它不是不能加载吗

孤独客 发表于 2005-5-29 19:15:00

如果写在lsp(mnl)文件中



只有加载了菜单文件, mnl文件才能加载


那菜单文件有怎么加载呢

秋枫 发表于 2005-5-29 22:57:00

这需要打开AutoCAD时自动运行那个lsp文件。


这个可以通过写入注册表实现。


找到AppLoad的Startup表,加一条就行了。

孤独客 发表于 2005-5-29 23:22:00

大哥


以CAD2002举个例子好吗?

秋枫 发表于 2005-5-30 21:06:00

本帖最后由 作者 于 2005-5-30 21:26:33 编辑

我系统中没有安装2002,无法详细说明,以2006为例,这个与2002的注册表结构是差不多的。



遍历的Innosetup源代码你可以参考本主题的4楼。





如图所示:注册表路径(2002的注册表路径就是R16.0下面了):


HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R16.2\ACAD-4001:409\Profiles\&lt;&lt;Unnamed Profile&gt;&gt;\Dialogs\Appload\Startup





其中,路径中的"ACAD-4001:409"与“&lt;&lt;Unnamed Profile&gt;&gt;”名称分别需要遍历R16.2键与Profiles键的子键得到,因为不同的系统不同的AutoCAD版本这个值是不同的,因此你至少需要在你的安装程序中有3循环,第一层是版本级,比如R16.0, R16.1, R16.2,第二层是同一版本级,比如AutoCAD 2000与2002的区别(它们都是16.0级下的),中文版2002与英文版2002及其它语言版本的区别都是在这一级,第三层是Profiles级,同一个AutoCAD下的不同配置,比如一些二次开发软件采用不同的Profiles。


最后,对于每个循环下找到的这个键Dialogs\Appload\Startup,下面有两个值(如果键不存在,可以创建之)


NumStartup表示一共有几个开始时自动加载的程序


然后是第一个程序1Startup,第二个程序2Startup,第三个程序……依次类推。


你可以考虑把NumStartup增加1,然后自己添加一项NStartup(N表示你的NumStartup值),当然安全一点的你应该考虑看看是否已经添加了,卸载时也要考虑恢复原状的问题。


为了保证你的程序能加载,还需要通知AutoCAD启动时加载Appload模块。


找到如图所示的位置(同样也需要遍历),读取LoadCtrls的值,将这个值与2作“或”运算,再写回。这样可以保证AutoCAD启动时会加载Appload.arx模块。


秋枫 发表于 2005-5-30 21:13:00

另外关于加载菜单组的问题你可以看看各个Profile下面的Menus键。做法也是类似的。你如果不想通过lisp程序加载菜单组,那么你需要修改这下面的键值。


R14与R15有所不同,但大致相同。


R15.0~R16.1这下面大概是差不多的。


R16.2(AutoCAD 2006)这下面有很大的区别,你可以自己研究一下(我没有研究过)。


       


当然,最简单的办法还是使用我提供的通用安装程序,告诉我的安装程序你启动时自己加载哪个lsp程序,然后在这个lsp中加载菜单组(这种做法目前2006与2005还是兼容的)。
页: 1 2 3 [4] 5 6 7 8 9 10 11 12 13
查看完整版本: AutoCAD二次开发安装程序制作(2019-11-11)