如何禁用MFC编辑框弹出菜单的附加项?

5

是否有一种干净简单的方法可以禁用编辑控件上下文弹出菜单中的“从右到左阅读顺序”和Unicode相关消息。是的,我知道可以子类化并拦截WM_CONTEXTPOPUP,然后遍历菜单。附上涉及菜单项的图像。

Ienter image description here


上下文菜单由股票编辑控件提供,MFC包装器在很大程度上是无关紧要的。似乎没有“干净简单的方法”来自定义上下文菜单,例如在如何禁用Windows编辑控件上下文菜单中的复制/粘贴命令?的顶部答案中所示。 - dxiv
1个回答

5

我知道你说你不想用子类化的方法,但我认为这并不困难。

CEdit派生,这种情况下我使用了类名CEditContextMenu,并且在消息映射中加入了WM_CONTEXTMENU

EditContextMenu.cpp

// ...
BEGIN_MESSAGE_MAP(CEditContextMenu, CEdit)
    ON_MESSAGE(WM_CONTEXTMENU, &CEditContextMenu::OnContextMenu)
END_MESSAGE_MAP()

// CEditContextMenu message handlers
LRESULT CEditContextMenu::OnContextMenu(WPARAM wParam, LPARAM lParam){
    HWINEVENTHOOK hWinEventHook{
        SetWinEventHook(EVENT_SYSTEM_MENUPOPUPSTART, EVENT_SYSTEM_MENUPOPUPSTART, NULL,
            [](HWINEVENTHOOK hWinEventHook, DWORD Event, HWND hWnd, LONG idObject,
                LONG idChild, DWORD idEventThread, DWORD dwmsEventTime){
                if (idObject == OBJID_CLIENT && idChild == CHILDID_SELF){
                    CMenu* pMenu{
                        CMenu::FromHandle((HMENU)::SendMessage(
                            hWnd, MN_GETHMENU, NULL, NULL))
                    };
                    pMenu->EnableMenuItem(32768, MF_DISABLED);
                }
            },
            GetCurrentProcessId(), GetCurrentThreadId(), WINEVENT_OUTOFCONTEXT)
    };

    LRESULT ret{ Default() };
    UnhookWinEvent(hWinEventHook);
    return ret;
}
// ...

也许你可以做些花哨的事情,观察 WS_EX_RTLREADING 并以某种方式阻止它。
其实你想在低层改变操作系统的功能。我认为没有一种优雅的有机方式来做到这一点。

1
谢谢你的回答和代码。我不知道它来自操作系统。我希望我可以在hWnd上设置一个标志或在资源编辑器中设置一些东西。 - dgrandm
@dgrandm -- 没问题。任何时候你都在处理系统控件,都会感到痛苦。祝你好运。 - Andy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接