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

dgr*_*ndm 5 c++ mfc

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

一世在此处输入图片说明

And*_*ndy 5

我知道你说过你不想子类化,但我不认为这很痛苦。

派生自CEdit,在这种情况下,我使用了类名CEditContextMenu并添加WM_CONTEXTMENU到您的消息映射中:

编辑上下文菜单.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;
}
// ...
Run Code Online (Sandbox Code Playgroud)

也许你可以做一些花哨的事情,然后观察WS_EX_RTLREADING并阻止它。

归根结底,您希望在低级别更改操作系统的运行方式。我认为没有一种优雅的方式可以有机地做到这一点。