gpt4 book ai didi

c++ - Delphi XE - 无法从系统菜单中删除项目

转载 作者:太空宇宙 更新时间:2023-11-04 00:53:06 25 4
gpt4 key购买 nike

我有以下代码,它正在向系统菜单添加项目。我的问题是 DeleteMenu(SysMenu, cLANGMENU, MF_BYCOMMAND) 没有删除添加到系统菜单的弹出菜单。我不明白的是为什么要为添加的项目(扫描组件)工作,而不是为“程序语言”工作

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;

LE: 这段代码运行了几次,所以我需要删除每次添加的项目。LE2:即使这段代码是用 Delphi(Object Pascal) 编写的,它也会从 Windows 调用 WinApi 函数。也许有人对此进行了大量工作并且是 C/C++ 程序员可以提供帮助。

最佳答案

The documentation表示需要设置miim_ID标志才能使用wID。没有它,操作系统会忽略该字段,因此您创建的菜单项不会获得您指定的 ID 值。因此,您进一步尝试通过该 ID 引用该项目将失败。

您在添加“扫描组件”项时设置了该标志,但在“测试”项中省略了它。

您可以通过调用 GetSystemMenu(Handle, True) 让自己更轻松。这将在您每次调用时重置菜单,因此您不必撤消任何先前的自定义设置。

关于c++ - Delphi XE - 无法从系统菜单中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11719322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com