C++ Delphi XE-无法从系统菜单中删除项目
我有下面的代码,它正在向系统菜单添加项。我的问题是DeleteMenu(SysMenu、cLANGMENU、MF_BYCOMMAND)没有删除添加到系统菜单中的弹出菜单。我不明白的是,为什么要为添加的项目(扫描组件)工作,而不是为“程序语言”工作C++ Delphi XE-无法从系统菜单中删除项目,c++,c,delphi,winapi,menuitem,C++,C,Delphi,Winapi,Menuitem,我有下面的代码,它正在向系统菜单添加项。我的问题是DeleteMenu(SysMenu、cLANGMENU、MF_BYCOMMAND)没有删除添加到系统菜单中的弹出菜单。我不明白的是,为什么要为添加的项目(扫描组件)工作,而不是为“程序语言”工作 procedure TForm1.Button1Click(Sender: TObject); const aBaseItem : string = 'Programm-Sprache'; cSepSYSTEM_MENU = wm_user
procedure TForm1.Button1Click(Sender: TObject);
const aBaseItem : string = 'Programm-Sprache';
cSepSYSTEM_MENU = wm_user + 100;
cScanCompSystemMenu = wm_user + 101;
cLANGMENU = wm_user + 102;
SC_ITEM = $FF00;
var
MenuItemInfo: TMenuItemInfo;
PopupMenu: HMENU;
Result: Boolean;
SysMenu: HMenu;
iPos, NumItems : Integer;
wTemp1, wtemp2 : string;
Buffer: array[0..79] of Char;
begin
{Create the popup menu}
PopupMenu := CreatePopupMenu;
{Insert an item into it}
for iPos := 5 downto 0 do
begin
FillChar(MenuItemInfo, SizeOf(MenuItemInfo), iPos);
with MenuItemInfo do
begin
cbSize := SizeOf(MenuItemInfo);
fMask := MIIM_TYPE or MIIM_ID;
fType := MFT_STRING;
wID := SC_ITEM + iPos;
dwTypeData := PChar(inttostr(iPos));
cch := Length(dwTypeData) * 2 + 2; //4; {'Item' is 4 chars}
end;
Result := InsertMenuItem(PopupMenu, 0, True, MenuItemInfo);
Assert(Result, 'InsertMenuItem failed');
end;
SysMenu := GetSystemMenu(Handle, False);
//why this isn't working???
if not DeleteMenu(SysMenu, cLANGMENU, MF_BYCOMMAND) then
begin
ShowMessage('System Error Message: '+ SysErrorMessage(GetLastError)) ;
//error message is - operation completed succesfully
end;
{Insert the popup into the system menu}
FillChar(MenuItemInfo, SizeOf(MenuItemInfo), 0);
with MenuItemInfo do
begin
cbSize := SizeOf(MenuItemInfo);
fMask := MIIM_SUBMENU or MIIM_TYPE or MIIM_ID;
fType := MFT_STRING;
hSubMenu := PopupMenu;
wId := cLANGMENU;
dwTypeData := PChar('Test');//Before editing the question it was Program Language
cch := Length(dwTypeData) * 2 + 2; //7; {'SubMenu' is 7 chars}
end;
Assert(SysMenu <> 0);
Result := InsertMenuItem(SysMenu, GetMenuItemCount(SysMenu), True, MenuItemInfo);
Assert(Result, 'InsertMenuItem failed');
SysMenu := GetSystemMenu(Handle, False);
//delete menu if exists - this is working
DeleteMenu(SysMenu,cSepSYSTEM_MENU,MF_SEPARATOR);
DeleteMenu(SysMenu,cScanCompSystemMenu,MFT_STRING);
//add new ones
InsertMenu(SysMenu, Word(-1), MF_SEPARATOR, cSepSYSTEM_MENU, '');
FillChar(MenuItemInfo, SizeOf(TMenuItemInfo), #0);
with MenuItemInfo do
begin
cbSize := SizeOf(TMenuItemInfo);
fMask := MIIM_TYPE or MIIM_ID or MIIM_STATE;
fType := MFT_STRING;
wId := cScanCompSystemMenu;
dwTypeData := PChar('Scan components');
cch := Length('Scan components');
end;
Result := InsertMenuItem(SysMenu, GetMenuItemCount(SysMenu), True, MenuItemInfo);
Assert(Result, 'InsertMenuItem failed');
end;
procedure TForm1.按钮1点击(发送方:TObject);
const aBaseItem:string='programmsprache';
cSepSYSTEM\u菜单=wm\u用户+100;
cScanCompSystemMenu=wm_user+101;
cLANGMENU=wm_user+102;
SC_项目=FF00美元;
变量
MenuItemInfo:TMenuItemInfo;
弹出菜单:HMENU;
结果:布尔型;
系统菜单:HMenu;
IPO,单位:整数;
wTemp1,wtemp2:字符串;
缓冲区:字符的数组[0..79];
开始
{创建弹出菜单}
PopupMenu:=CreatePopupMenu;
{在其中插入一项}
对于首次公开募股:=5至0 do
开始
FillChar(MenuItemInfo、SizeOf(MenuItemInfo)、IPO;
和MenuItemInfo一起做
开始
cbSize:=SizeOf(MenuItemInfo);
fMask:=mimu类型或mimu ID;
F类型:=MFT_字符串;
wID:=SC_项目+首次公开募股;
dwTypeData:=PChar(inttostr(iPos));
cch:=长度(dwTypeData)*2+2//4.{'Item'是4个字符}
终止
结果:=InsertMenuItem(弹出菜单,0,True,MenuItemInfo);
断言(结果“InsertMenuItem失败”);
终止
SysMenu:=GetSystemMenu(句柄,False);
//为什么这不起作用???
如果没有删除菜单(SysMenu、cLANGMENU、MF_BYCOMMAND),则
开始
ShowMessage('System Error Message:'+SysErrorMessage(GetLastError));
//错误消息为-操作已成功完成
终止
{将弹出窗口插入系统菜单}
FillChar(MenuItemInfo,SizeOf(MenuItemInfo),0);
和MenuItemInfo一起做
开始
cbSize:=SizeOf(MenuItemInfo);
fMask:=mimu子菜单或mimu类型或mimu ID;
F类型:=MFT_字符串;
hSubMenu:=弹出菜单;
wId:=cLANGMENU;
dwTypeData:=PChar(“测试”)//在编辑问题之前,它是程序语言
cch:=长度(dwTypeData)*2+2//7.{'SubMenu'是7个字符}
终止
断言(系统菜单0);
结果:=InsertMenuItem(系统菜单,GetMenuItemCount(系统菜单),True,MenuItemInfo);
断言(结果“InsertMenuItem失败”);
SysMenu:=GetSystemMenu(句柄,False);
//删除菜单(如果存在)-这正在工作
DeleteMenu(系统菜单、cSepSYSTEM\u菜单、MF\u分隔符);
DeleteMenu(系统菜单、cScanCompSystemMenu、MFT_字符串);
//添加新的
插入菜单(SysMenu,Word(-1)、MF_分隔符、cSepSYSTEM_菜单“”);
FillChar(MenuItemInfo,SizeOf(TMenuItemInfo),#0);
和MenuItemInfo一起做
开始
cbSize:=SizeOf(TMenuItemInfo);
fMask:=mimu类型或mimu ID或mimu状态;
F类型:=MFT_字符串;
wId:=cScanCompSystemMenu;
dwTypeData:=PChar(“扫描组件”);
cch:=长度(“扫描组件”);
终止
结果:=InsertMenuItem(系统菜单,GetMenuItemCount(系统菜单),True,MenuItemInfo);
断言(结果“InsertMenuItem失败”);
终止
乐:这段代码运行了好几次,所以我需要删除每次添加的项目。
LE2:即使这段代码是用Delphi(Object Pascal)编写的,它也会从Windows调用WinApi函数。也许有人在这方面做过大量的工作,并且是C/C++程序员,可以提供帮助。Delphi XE2-每次单击按钮都会添加一个
程序语言
系统菜单项,并且对扫描组件
没有影响,尽管您说它已为您删除
我认为这是因为扫描组件是一个顶级菜单项,没有子菜单,而“程序语言”有子菜单项0->5。我怀疑,如果你先删除这些,那么你应该能够删除父菜单(嗯,它不应该清理它自己的子菜单吗?)
我很抱歉,但我没有时间编码/验证这一点,因为我要赶飞机,而且我们在不同的Delphi版本中似乎有不同的行为-但这就是两者之间的区别,也是您应该看到的
我希望我能提供更多帮助。Delphi XE2-每次单击按钮都会添加一个程序语言
系统菜单项,并且对扫描组件
没有影响,尽管您说它已为您删除
我认为这是因为扫描组件是一个顶级菜单项,没有子菜单,而“程序语言”有子菜单项0->5。我怀疑,如果你先删除这些,那么你应该能够删除父菜单(嗯,它不应该清理它自己的子菜单吗?)
我很抱歉,但我没有时间编码/验证这一点,因为我要赶飞机,而且我们在不同的Delphi版本中似乎有不同的行为-但这就是两者之间的区别,也是您应该看到的
我希望能提供更多帮助。表示您需要设置miim\u ID
标志以使用wID
。如果没有它,操作系统将忽略该字段,因此您创建的菜单项不会获得您指定的ID值。因此,您进一步尝试通过该ID引用该项失败
在添加“扫描组件”项时设置该标志,但在“测试”项中忽略该标志
您可以通过调用GetSystemMenu(Handle,True)
来简化自己。这将在每次调用菜单时重置它,因此您不必撤消以前的任何自定义。表示您需要设置miim\u ID
标志以使用wID
。如果没有它,操作系统将忽略该字段,因此您创建的菜单项不会获得您指定的ID值。因此,您进一步尝试通过该ID引用该项失败
在添加“扫描组件”项时设置该标志,但在“测试”项中忽略该标志
您可以通过调用GetSystemMenu(Handle,True)
来简化自己。这将在每次调用时重置菜单,因此您不必撤消以前的任何自定义操作。基于
procedure TForm1.Button1Click(Sender: TObject);
const
cSepSYSTEM_MENU = wm_user + 100;
cScanCompSystemMenu = wm_user + 101;
cLANGMENU = 65444;
SC_ITEM = $FF00;
var
MenuItemInfo: TMenuItemInfo;
PopupMenu: HMENU;
Result: Boolean;
SysMenu: HMenu;
iPos, NumItems : Integer;
wTemp1, wtemp2 : string;
Buffer: array[0..79] of Char;
subMenu : HMENU;
begin
SysMenu := GetSystemMenu(Handle, True);
SysMenu := GetSystemMenu(Handle, False);
//add new ones
InsertMenu(SysMenu, Word(-1), MF_SEPARATOR, cSepSYSTEM_MENU, '');
FillChar(MenuItemInfo, SizeOf(TMenuItemInfo), #0);
with MenuItemInfo do
begin
cbSize := SizeOf(TMenuItemInfo);
fMask := MIIM_TYPE or MIIM_ID or MIIM_STATE;
fType := MFT_STRING;
wId := cScanCompSystemMenu;
dwTypeData := PChar('Scan components');
cch := Length('Scan components');
end;
Result := InsertMenuItem(SysMenu, GetMenuItemCount(SysMenu), True, MenuItemInfo);
Assert(Result, 'InsertMenuItem failed');
{Create the popup menu}
PopupMenu := CreatePopupMenu;
{Insert an item into it}
for iPos := Random(10) downto 0 do
begin
FillChar(MenuItemInfo, SizeOf(MenuItemInfo), 0);
with MenuItemInfo do
begin
cbSize := SizeOf(MenuItemInfo);
fMask := MIIM_TYPE or MIIM_ID;
fType := MFT_STRING;
wID := SC_ITEM + iPos;
dwTypeData := PChar(inttostr(iPos));
cch := Length(dwTypeData) * 2 + 2; //4; {'Item' is 4 chars}
end;
Result := InsertMenuItem(PopupMenu, 0, True, MenuItemInfo);
Assert(Result, 'InsertMenuItem failed');
end;
FillChar(MenuItemInfo, SizeOf(MenuItemInfo), 0);
with MenuItemInfo do
begin
cbSize := SizeOf(MenuItemInfo);
fMask := MIIM_SUBMENU or MIIM_TYPE;
fType := MFT_STRING;
hSubMenu := PopupMenu;
wId := cLANGMENU;
dwTypeData := PChar('Programm-Language');
cch := Length(dwTypeData) * 2 + 2; //7; {'SubMenu' is 7 chars}
end;
Assert(SysMenu <> 0);
Result := InsertMenuItem(SysMenu, GetMenuItemCount(SysMenu), True, MenuItemInfo);
Assert(Result, 'InsertMenuItem failed');
end;