Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Delphi XE-无法从系统菜单中删除项目_C++_C_Delphi_Winapi_Menuitem - Fatal编程技术网

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

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

我有下面的代码,它正在向系统菜单添加项。我的问题是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;
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;