从 Windows' 系统菜单中删除移动和关闭命令而不丢失功能

Remove Move and Close commands from Windows' system menu without losing functionality

我想从 Windows dialog-based 应用程序的系统菜单中删除移动和关闭命令,而不丢失这些命令的功能或删除系统菜单。 (我正在使用 MFC,但对纯 C++ 解决方案开放。)

以下将从系统菜单中删除移动命令:

CMenu* pSysMenu = GetSystemMenu(FALSE);
if(pSysMenu != NULL)
        pSysMenu->RemoveMenu(SC_MOVE, MF_BYCOMMAND);

但是window不能再拖动了

同样,这将删除关闭命令。

pSysMenu->RemoveMenu(SC_CLOSE, MF_BYCOMMAND);

但它也会禁用 window 标题栏中的关闭按钮(“x”)。

谢谢!

(我知道你们中的一些人很想告诉我我不应该删除这些命令。我听到了,但这是一个独特的情况。谢谢。)

您可以在 WM_INITMENUPOPUP 处理程序中从系统菜单中删除这些项目。

如您所见,这将禁用 window 中的相关功能。

但是,您可以在 lesser-known WM_UNINITMENUPOPUP 消息的处理程序中恢复这些项目。

将此添加到对话框的 class 定义中:

afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);
afx_msg void OnUnInitMenuPopup(CMenu *pPopupMenu, UINT nFlags);

将其添加到消息映射中:

ON_WM_INITMENUPOPUP()
ON_WM_UNINITMENUPOPUP()

然后您将在 OnInitMenuPopup:

中删除这些项目(就像您所做的那样)
pPopupMenu->RemoveMenu(SC_MOVE, MF_BYCOMMAND);

和re-insert他们在OnUnInitMenuPopup:

pPopupMenu->InsertMenuItemW(SC_MOVE, &m_mii);

请注意 &m_mii 我在 class:

中定义
MENUITEMINFO m_mii = {sizeof MENUITEMINFO};

您将为每个需要隐藏的菜单项声明该结构,并在删除它们之前用 GetMenuItemInfo 填充它。很可能,您只需要执行一次并保存以备后用。这将允许您保存菜单字符串、位图等。但是,没有直接的方法(据我所知)获取您的项目在原始菜单中的位置;我会遍历所有项目 by-position 以查找这些命令。有点乏味...

P.S。只需意识到您永远不会在系统菜单中显示这些项目,因此您无需为保存它们的位置、位图甚至字符串而烦恼。只需将它们附加到底部,仅命令 ID。