如何禁用MFC Edit控件弹出菜单附加项?

How to disable MFC Edit control popup menu additional items?

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

我知道你说你不想子class,但我不认为这有那么痛苦。

派生自 CEdit,在本例中我使用了 class 名称 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 并以某种方式阻止它。

归根结底,您想更改 OS 在低级别上的运作方式。我不认为有一种优雅的方式来有机地做到这一点。