如何禁用MFC编辑控件弹出菜单中的其他项?

问题描述

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

enter image description here

解决方法

我知道您说过您不想继承,但我不认为这很痛苦。

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))
                    };
                    pMenu->EnableMenuItem(32768,MF_DISABLED);
                }
            },GetCurrentProcessId(),GetCurrentThreadId(),WINEVENT_OUTOFCONTEXT)
    };

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

也许您可以做些花哨的事情,注意WS_EX_RTLREADING并以某种方式阻止它。

最后,您想更改操作系统的底层功能。我认为没有一种有机的优雅方法。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...