问题描述
是否有一种干净简便的方法可以从上下文弹出菜单中禁用“从右到左阅读顺序”和Unicode相关消息,以进行编辑控件。是的,我知道我可以继承并拦截WM_CONTEXTPOPUP
,然后浏览菜单。附件是带有相关菜单项的图像。
解决方法
我知道您说过您不想继承,但我不认为这很痛苦。
从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
并以某种方式阻止它。
最后,您想更改操作系统的底层功能。我认为没有一种有机的优雅方法。