代码之家  ›  专栏  ›  技术社区  ›  Andreas Rejbrand

如何禁用移动系统菜单项?

  •  6
  • Andreas Rejbrand  · 技术社区  · 16 年前

    在Microsoft Windows中,此操作有效:

     mnu := GetSystemMenu(h, false);
     EnableMenuItem(mnu, SC_CLOSE, MF_BYCOMMAND or MF_GRAYED);
    

     mnu := GetSystemMenu(h, false);
     EnableMenuItem(mnu, SC_MOVE, MF_BYCOMMAND or MF_GRAYED);
    

    因此,我知道如何禁用窗口的“关闭”系统菜单项,而不是“移动”项。我该怎么做?

    更新

    当然,使用非常好的函数enableMenueItem的一个替代方法是使用SetMenuItemInfo:

      FillChar(info, sizeOf(info), 0);
      with info do
      begin
        cbSize := sizeOf(info);
        fMask := MIIM_STATE;
        fState := MFS_GRAYED;
      end;
      SetMenuItemInfo(mnu, SC_MOVE, false, info);
    

    但这同样适用于SC\u CLOSE,但不适用于SC\u MOVE!

    更新2

    即使这个问题在某种意义上得到了解决,一个工作代码已经被发现“做工作”,可以说,它将有趣地听到关于问题原因的假设:为什么SC\u关闭工作,而不是SC\u移动?

    2 回复  |  直到 16 年前
        1
  •  6
  •   Hans Passant    16 年前

    这有点神秘,但如果您使用ModifyMenu或DeleteMenu,它会起作用:

       HMENU mnu = GetSystemMenu(hWnd, false);
       DeleteMenu(mnu, SC_MOVE, MF_BYCOMMAND);
    

    或:

       HMENU mnu = GetSystemMenu(hWnd, false);
       MENUITEMINFO info = { sizeof(MENUITEMINFO) };
       TCHAR name[256] = _T("Cannot move");
       info.fMask = MIIM_TYPE;
       info.dwTypeData = name;
       info.cch = sizeof(name) / sizeof(TCHAR);
       GetMenuItemInfo(mnu, SC_MOVE, false, &info);
       ModifyMenu(mnu, SC_MOVE, MF_BYCOMMAND | MF_GRAYED, 0, info.dwTypeData);
    
        2
  •  4
  •   GDP Danny    14 年前

    如果使用销毁菜单项 DeleteMenu()

    关键是暂时删除该项。

    首先,使用以下语句保存“Move”项的标题:

    GetMenuString(hMenu, SC_MOVE, szMoveCaption, MAX_PATH, MF_BYCOMMAND);

    然后从菜单中删除该项:

    RemoveMenu(hMenu, SC_MOVE, MF_BYCOMMAND);

    InsertMenu(hMenu, 0, MF_BYPOSITION, SC_MOVE, szMoveCaption);

    附言

    推荐文章