他の誰かがも、oncontextmenu取り扱うかどうかを知る方法
-
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フレームワークを介して可能でしょうか?
解決
何かがデフォルトのハンドラ実装の際に起こった場合は、
私は発見する方法を見つけました。これは、最もエレガントな解決策ではないかもしれないが、ここでは、次のとおりです。
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