Как узнать, если кто-то другой обрабатывал oncongextmenu

StackOverflow https://stackoverflow.com/questions/4017914

Вопрос

у меня есть 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
        // ...
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top