Search code examples
winapisystemmenu

How to Disable the Move System Menu Item?


In Microsoft Windows, this works:

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

But this does not work:

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

Hence I know how to disable the "Close" system menu item of a window, but not the "Move" item. How do I do that?

Update

Of course one alternative to using the very nice function EnableMenuItem, is to use 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);

But this again works perfectly for SC_CLOSE, but not at all for SC_MOVE!

Update 2

Even though the problem is resolved in the sense that a working code has been found that "does the job", so to speak, it would be interesting to hear hypotheses regarding the cause of the problem: Why does SC_CLOSE work but not SC_MOVE?


Solution

  • It's a bit of a mystery but it works if you use ModifyMenu or DeleteMenu:

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

    or:

       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);