Wie kann man wissen, wenn jemand anderes behandelt OnContextMenu
-
26-09-2019 - |
Frage
Ich habe eine CWnd
abgeleitete Klasse, die einen WM_CONTEXTMENU
Handler (OnContextMenu
) hat, die mein Standardkontextmenü hat. Diese Klasse wird an mehreren Stellen in meiner Anwendung verwendet.
Einige der Orte, wo es auch die WM_CONTEXTMENU
auf der übergeordneten Ebene behandelt verwendet werden wird (das übergeordnete Fenster). Sie haben Vorrang vor grundsätzlich das Standardkontextmenü.
Als ich in der CWnd
abgeleiteten Klasse bin, mag ich im Grunde wissen, ob jemand anderes (ein Fenster Eltern) das Kontextmenü behandelt.
Beispiel:
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
// ...
}
Es ist möglich, über das Win32 / MFC-Framework?
Lösung
Ich fand einen Weg, um herauszufinden, ob etwas während der Standard-Handler Implementierung passiert ist. Es ist vielleicht nicht die eleganteste Lösung, aber hier ist es:
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
// ...
}
}