Я думаю, что решил проблему. После получения объекта hwnd в if (SUCCEEDED(pWnd->GetWindow(&hwnd)))
установите свой собственный CALLBACK для контекстного меню. В обратном вызове
if ((uMsg == WM_INITMENUPOPUP) && (wParam == (WPARAM) menu)) {
return 0;
}
в противном случае позвольте исходному обработчику обработать его.
однажды с
long myRetVal = ::TrackPopupMenu(g_hPubMenu,TPM_RIGHTBUTTON | TPM_LEFTALIGN | TPM_RETURNCMD,
ppt->x, ppt->y, NULL, hwnd, NULL);
вернуться к исходному обработчику процедур ....
Sample
WNDPROC g_lpPrevWndProc = NULL;
HRESULT CWebEventHandler::ShowContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdTarget, IDispatch *pdispObject)
{
if (false)
return S_FALSE; // Show standard context menus.
else
{
IOleWindow* pWnd = NULL;
HRESULT hr = pcmdTarget->QueryInterface(IID_IOleWindow,
(void**) &pWnd);
if (SUCCEEDED(hr))
{
HWND hwnd;
if (SUCCEEDED(pWnd->GetWindow(&hwnd)))
{
g_lpPrevWndProc = (WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (LONG)CtxMenuWndProc);
if (g_hPubMenu)
{
DestroyMenu(g_hPubMenu);
g_hPubMenu = NULL;
}
g_hPubMenu = ::CreatePopupMenu();
::AppendMenu(g_hPubMenu, MF_STRING|MF_ENABLED , ID_HELLO, L"&Hello" );
::AppendMenu(g_hPubMenu, MF_STRING|MF_ENABLED , ID_WORLD, L"&World" );
long myRetVal = ::TrackPopupMenu(g_hPubMenu,
TPM_RIGHTBUTTON | TPM_LEFTALIGN | TPM_RETURNCMD,
ppt->x, ppt->y, NULL, hwnd, NULL);
SetWindowLong(hwnd, GWL_WNDPROC, (LONG)g_lpPrevWndProc);
// Send the command to the browser.
//
if (myRetVal == ID_HELLO)
{
box(_T("Hello"));
}else if(myRetVal == ID_WORLD)
{
box(_T("World"));
}else{
LRESULT myResult = ::SendMessage(hwnd, WM_COMMAND,myRetVal, NULL);
}
}
pWnd->Release();
}
}
return S_OK;
}
LRESULT CALLBACK CtxMenuWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if ((uMsg == WM_INITMENUPOPUP) && (wParam == (WPARAM) g_hPubMenu)) {
return 0;
}
return CallWindowProc(g_lpPrevWndProc, hwnd, uMsg, wParam, lParam);
}