如何知道其他人是否处理过OnContextMenu

时间:2010-10-25 19:04:41

标签: mfc winapi contextmenu window-messages

我有一个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框架吗?

1 个答案:

答案 0 :(得分:0)

我找到了一种方法来发现在默认处理程序实现期间是否发生了某些事情。它可能不是最优雅的解决方案,但它是:

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
        // ...
    }
}