В 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);
Следовательно я знаю, как отключить "Близкий" пункт меню системы окна, но не объект "Перемещения". Как я делаю это?
Обновление
Конечно, одна альтернатива использованию очень хорошего функционального EnableMenuItem, должен использовать 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_CLOSE, но нисколько на SC_MOVE!
Обновление 2
Даже при том, что проблема разрешена в том смысле, что рабочий код был найден, это "делает задание", если можно так выразиться, было бы интересно услышать, что гипотезы расценивают причину проблемы: Почему SC_CLOSE работает, но не SC_MOVE?
Это немного загадка, но это работает, если вы используете 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);