Najprościej zrobisz to na standardowym akceleratorze:
void MainOnComand(WPARAM wParam)
{
CMdiChild *child;
/*if (HIWORD(wParam) == 1) /*accelerator*/ wParam = LOWORD(wParam);
if (ChildGetCurrentChild(&child))
{
ChildHandleCommand(child, wParam); // poniżej
ToolbarHandleCommand(wParam);
}
switch (wParam) {}
}
void ChildHandleCommand(CMdiChild *child, WPARAM wParam)
{
if (child->type == CHILDDTYPE_HTML)
{
switch (wParam)
{
case 107: // toolbar
child->m_browser->GoBack();
break;
case 108: // toolbar
child->m_browser->GoForward();
break;
case IDM_COPY:
child->m_browser->ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
break;
case IDM_FIND:
// browser->document->QueryInterface(IOleCommandTarget)->Exec(
// CGID_IWebBrowser, HTMLID_FIND, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
child->m_events->ExecHtmlDispId(HTMLID_FIND);
break;
case IDM_SELECTALL:
child->m_browser->ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
break;
// jeszcze dodaj paste, undo i redo na szablonie browser->ExecWB
}
}
else ...
Dla klawisza ENTER też dodaj akcelerator, a w jego obsłudze sprawdź jakie okno ma fokus i odpal odpowiednią akcję. Jeżeli to browser, to browser->document->activeElement zwróci aktywny element. Jeżeli element->get_form nie jest zerem, to odpal form->submit.
Gdyby akcelerator na klawisz ENTER stwarzał zbyt wiele problemów (gdy trzeba napisać sporo kodu by nadrobić niedziałanie czegoś) to wykrywaj ENTER w pętli komunikatów.