孤独客
发表于 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\<<Unnamed Profile>>\Dialogs\Appload\Startup
其中,路径中的"ACAD-4001:409"与“<<Unnamed Profile>>”名称分别需要遍历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