从 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。
我想从 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。