Как узнать, если кто-то другой обрабатывал oncongextmenu
-
26-09-2019 - |
Вопрос
у меня есть CWnd
полученный класс, который имеет WM_CONTEXTMENU
обработчик (OnContextMenu
), который имеет мое контекстное меню по умолчанию. Этот класс используется в нескольких местах в моем приложении.
Некоторые из мест, где он используется, также обрабатывать WM_CONTEXTMENU
на родительском уровне (окно родителя). Они в основном переопределяют контекстное меню по умолчанию.
Когда я внутри CWnd
Полученный класс, я в основном хочу знать, если кто-то еще (родитель окна) обрабатывал контекстное меню.
Например:
void MyDerivedWnd::OnContextMenu( CWnd* in_pWnd, CPoint in_point )
{
LRESULT res = __super::Default();
// Now, how to I know of something happened inside __super::Default();??
// Show my default menu
// ...
}
Это возможно через Win32 / MFC Framework?
Решение
Я нашел способ обнаружить, если что-то произошло во время реализации обработчика по умолчанию. Это может быть не самое элегантное решение, но вот оно:
bool g_bWindowCreated = false;
HHOOK g_hHook = NULL;
LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
{
if( code == HCBT_CREATEWND )
g_bWindowCreated = true;
return CallNextHookEx( g_hHook, code, wParam, lParam );
}
void MyDerivedWnd::OnContextMenu( CWnd* in_pWnd, CPoint in_point )
{
// Setup a hook to know if a window was created during the
// Default WM_CONTEXT_MENU handler
g_bWindowCreated = false;
g_hHook = SetWindowsHookEx( WH_CBT, HookProc, NULL, GetCurrentThreadId() );
// Call the default handler
LRESULT res = __super::Default();
UnhookWindowsHookEx( g_hHook );
if( !g_bWindowCreated )
{
// Show my default menu
// ...
}
}
Не связан с StackOverflow