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



我想在不失去这些命令的功能或删除系统菜单的情况下,从基于Windows对话框的应用程序的系统菜单中删除"移动"one_answers"关闭"命令。(我使用MFC,但对纯c++解决方案开放。(

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

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

但是窗口不能再拖动了。

类似地,这将删除"关闭"命令。

pSysMenu->RemoveMenu(SC_CLOSE, MF_BYCOMMAND);

但它也禁用了窗口标题栏中的关闭按钮("x"(。

谢谢!

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

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

正如您所注意到的,这将禁用窗口中的相关功能。

但是,您可以在鲜为人知的WM_UNINITMENUPOPUP消息的处理程序中恢复这些项。

将其添加到对话框的类定义中:

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

并将它们重新插入OnUnInitMenuPopup:

pPopupMenu->InsertMenuItemW(SC_MOVE, &m_mii);

请注意我在类中定义的&m_mii

MENUITEMINFO m_mii = {sizeof MENUITEMINFO};

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

第页。S.只要意识到你永远不会在系统菜单中显示这些项目,所以你不需要麻烦保存它们的位置、位图甚至字符串。只需将它们附加到底部,仅限命令ID。

最新更新