怎样在系统菜单里添加子菜单?(200分)

  • 主题发起人 主题发起人 plwei
  • 开始时间 开始时间
P

plwei

Unregistered / Unconfirmed
GUEST, unregistred user!
我知道怎样在系统菜单里添加自己的菜单项,可是不知怎样添加自己的子菜单项,
应该怎么办?请大家不惜赐教。
 
你可以使用AppendMenu、InsertMenu函数加入子菜单。或使用TMenuItem的Add函数也可以。
 
怎样获得系统菜单的HMenu?
 
给你发一段代码算了:

procedure TForm1.FormCreate(Sender: TObject);
begin
AppendMenu(GetSystemMenu(Handle, False), MF_SEPARATOR, 0, '');
AppendMenu(GetSystemMenu(Handle, False), MF_STRING, 1111, '&About...');
AppendMenu(GetSystemMenu(Application.Handle, False), MF_SEPARATOR, 0, '');
AppendMenu(GetSystemMenu(Application.Handle, False), MF_STRING, 1111, '&About...');
Application.OnMessage := AppMessage;
end;

procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if (Msg.Message = WM_SYSCOMMAND) and (Msg.WParam = 1111) then
begin
with TFormAbout.Create(Self) do
try
Handled := True;
ShowModal;
finally
Release;
end;
end;
end;
 
自己看看menu 的帮助好了
 
Const
IDSysHelp=100;
procedure TForm1.FormCreate(Sender:TObject);
var
i:integer;
begin
AppendMenu(GetSystemMenu(Handle,False),MF_SEPARATOR,0,'');//插入水平分割线
AppendMenu(GetSystmeMenu(Handle,False),MF_STRING,IDSysHelp,'关于&H');//插入帮助菜单
with MainMenu1 do
for i:=0 to Items,Count-1 do
AppendMenu(GetSystemMenu(Self.Handle,False),MF_POPUP,Items.Handle,Pchar(
Items.Caption));
end;
 
const
IDNewMenu1 = 101;
IDNewMenu2 = 102;
IDNewMenu3 = 103;

procedure TForm1.FormCreate(Sender:TObject);
var
hSysMenu: HMENU;
hNewMenu: HMENU;
begin
//得到系统菜单
hSysMenu := GetSystemMenu(Handle, False);

//创建新菜单
hNewMenu := CreatePopupMenu;
AppendMenu(hNewMenu, MF_STRING, IDNewMenu1, '子菜单一');
AppendMenu(hNewMenu, MF_STRING, IDNewMenu2, '子菜单二');
AppendMenu(hNewMenu, MF_STRING, IDNewMenu3, '子菜单三');

//将新菜单写入系统菜单
InsertMenu(hSysMenu, DWORD(-1), MF_BYPOSITION or MF_POPUP, hNewMenu, '主菜单');
end;
 
不好意思可能我没有讲清楚:我所说的系统菜单指的是,windows自身的菜单,比如说
在桌面上单击鼠标右键弹出的菜单。
 
大富翁的第一个贴子就是这个问题,帮你粘过来了

话题000020的标题是: 如何在Win95弹出菜单中加入自己的内容和功能调用? (200分)
分类:系统相关 yysun (1998-9-8 22:51:00)
我如何在资源管理器的弹出菜单中加入自己的内容和功能调用?
就象Winzip在资源管理器的弹出菜单中显示"Add to ZIP"并
相应这个事件那样.

yysun (1998-8-28 11:43:00)
还可不可以在“我的电脑”或者“网络邻居”的弹出菜单中加入
我的内容?我自己的程序如何提供一个接口给其他人加入菜单进
来?

aiming (1998-8-31 14:25:00)
你可以给任何一种环境加入右键弹出的事件,条件是修改
注册表。我有一个相关的解释。但只能下一次提供给你了。
为了不使我的200分丢失,权写两句安慰安慰我的朋友们!
^-^
另:
建议设置成浏览已解答问题时扣10分,而浏览待解问题时
不扣分。要不,我的分扣得好冤! :-((

yysun (1998-8-31 16:48:00)
aiming,

谢谢您的回答,我只知道给某种类型文件(例如*.txt, *.zip)加上右键菜单的方法。
如果您能告之“给任何一种环境加入右键弹出的事件”,您就会获得这个问题的200分。

另,您回答问题,或者看待解问题,或者看您提供答案的问题都不会扣分。

aimingoo (1998-9-8 12:29:00)
嗨,我回来了。
我就是aiming.但那个注册的口令我忘了,所以只好重新注册来过。:-(((

关于多种环境注册右键弹出事件的方法,请
按照以下对应关系:
/HKEY_CLASSES_ROOT/Folder/Shell 任意文件夹
/HKEY_CLASSES_ROOT/Directory/Shell 任意目录
/HKEY_CLASSES_ROOT/Drive/Shell 任意驱动器
/HKEY_CLASSES_ROOT/*/Shell 任意文件
新建一个主键,并在主键下添加一个特定主键(command),修改command的键值指到你的应用程序。

例如:
建立/HKEY_CLASSES_ROOT/Folder/Shell/AimTest,将在Folder上按下右键时出现"AimTest"菜单
建立/HKEY_CLASSES_ROOT/Folder/Shell/AimTest,并设定该主键的缺省值为"我的测试菜单",则将在Folder上按下右键时出现"我的测试菜单"菜单钮。
建立/HKEY_CLASSES_ROOT/Folder/Shell/AimTest/command,并设定command"缺省"键值为"c:/tools/pse.exe" "%1",则将以Folder名为第一参数启动pse.exe。
* 注意command键值的双引号不可缺省

另外:
/HKEY_CLASSES_ROOT/Folder/Shellex
/HKEY_CLASSES_ROOT/Directory/Shellex
/HKEY_CLASSES_ROOT/Drive/Shellex
/HKEY_CLASSES_ROOT/*/Shellex
可以按应用程序在Registroy中的注册ID调用。这样可以调用.DLL和钩子函数。
但建议按第一种方法调用应用程序,因为注册一个ID实在麻烦。

如果你的应用程序支持DDE,你可以参考
/HKEY_CLASSES_ROOT/Directory/Shell/Find键的设定来进行DDE设置。

=============
不知这样能否满足你的要求。请告知。

yysun (1998-9-8 22:51:00)
aimingoo / aiming:非常感谢您, 。


aimingoo的回答最终被接受。
 
上面这位仁兄所说的方法N年前大家都已经清楚了,我是说怎样添加子菜单。
 
这是上下文菜单扩展问题。找本系统扩展的书看看,一般都有例子。
 
xianjun的代码就可以实现你想要的。
 

下面的方法是将一个主菜单所有项添加到系统菜单中,实现你要的效果。
点击事件相信你也会,不写了。
//放上一个MainMenu,添加一些Caption
for i := 0 to MainMenu1.Items.Count - 1 do
AppendMenu(GetSystemMenu(handle,false),MF_POPUP,mainMenu1.Items.Handle,pchar(mainMenu1.Items.caption));
 
Ctr+右方向箭
 
请问怎样获得系统菜单的handle,这里的系统菜单windows本身的菜单,例如
在桌面空白处单击右键弹出的菜单,恕兄弟我愚笨,大家多指点。
 
这叫上下文菜单(context menu ),你这是系统外壳扩展问题。
MSDN有例子,有一本Delphi5 的书上也有例子。
 
兄弟这样!!!!(转贴)
Unit OhYeah;

Interface

Uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
Controls, Forms, Dialogs, Menus;

Type
TForm1 = Class (TForm)
Procedure FormCreate (Sender : TObject);
Private {Private declarations}
Public {Public declarations}
Procedure WinMsg (Var Msg : TMsg; Var Handled : Boolean);
Procedure DoWhatEever;

End;

Var
Form1 : TForm1;

Implementation

{$R *.DFM}

Const
ItemID = 99; // 这个ID number代表你的菜单项,可以是任何值。

Procedure Tform1.WinMsg (Var Msg : TMsg; Var Handled : Boolean);

Begin
If Msg.Message = WM_SYSCOMMAND Then
If Msg.WParam = ItemID Then DoWhatEver;

End;

Procedure TForm1.FormCreate (Sender : TObject);

Begin
Application.OnMessage := WinMsg;
AppendMenu (GetSystemMenu (Form1.Handle, False), MF_SEPARATOR,
0, '');
AppendMenu (GetSystemMenu (Form1.Handle, False), MF_BYPOSITION,
ItemID, '&My menu');
AppendMenu (GetSystemMenu (Application.Handle, False),
MF_SEPARATOR, 0, '');
AppendMenu (GetSystemMenu (Application.Handle, False),
MF_BYPOSITION, ItemID,'&My menu minimized');

End;

Procedure TForm1.DoWhatEver;

Begin
Exit; //你可以添加任何你想加的东西到这里
End;

End.
 
大家好象没有看清楚我的问题。
我说的是上下文菜单(context menu ),是系统外壳扩展问题。
不知哪位能给个例子。
 
请参见:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=683323
 
后退
顶部