Здравствуйте, Аноним, Вы писали:
А>Проблема все еще жутко актуальна....
А>Подскажите плиз в каком направлении копать.
У меня была похожая проблема, возможно это сможет натолкнуть вас на какие-то идеи ...
Таск был таков: надо было напедалить Simple ActiveX WYSIWYG HtmlEditControl, делал я его на базе стандартного активикс-элемента виндового эксплорера (IWebBrowser2), документ которого (MSHTML::IHTMLDocument2) переводился в режим редактирования. Никаких акселераторов я не использовал, в смысле собственных, просто IWebBrowser2 поддерживает такие клавиатурные сокращения, как Ctrl+B чтобы назначить выделенному тексту Bold стиль, Ctrl+I чтобы назначить выделенному тексту Italic стиль, и так далее ... Так вот, чтобы дать шанс эксплорерскому контролу обрабатывать клавиатурные события и тем самым реагировать на собственные клавиатурные сокращения, необходимо отправлять окну эксплорера ATL сообщение WM_FORWARDMSG. Например класс WebBrowserControl субклассит окно эксплорерского контрола, тогда делается так:
class WebBrowserControl
: public CWindowImpl<WebBrowserControl, CAxWindow>
, public CMessageFilter
{
DECLARE_WND_CLASS(_T("WebBrowserControl"))
BOOL PreTranslateMessage(MSG* pMsg)
{
if((pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST) &&
(pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST))
return FALSE;
// give HTML page a chance to translate this message
return (BOOL)SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg);
}
// .... много всяких членов ....
private:
IDispatchPtr dispatchPtr_;
MSHTML::IHTMLDocument2Ptr htmlDoc2Ptr_;
IOleCommandTargetPtr oleCommandTargetPtr_;
IWebBrowser2Ptr webBrowserPtr_;
};
Класс CHtmlEditControl — есть тот самый ActiveX, который я педалил. Он, если хочет обрабатывать клавиатурные сокращения, а также давать возможность дочернему эксплореру их обрабатывать, должен тоже предоставить подобный интерфейс:
// CHtmlEditControl
class ATL_NO_VTABLE CHtmlEditControl
: /* бла бла бла ... всякое активиксовое наследование */
, public CComCompositeControl<CHtmlEditControl>
, /* бла бла бла ... всякое активиксовое наследование */
{
// .... много всяких членов ....
BEGIN_MSG_MAP(CHtmlEditControl)
// .... всякие обработчики ....
MESSAGE_HANDLER ( WM_FORWARDMSG, OnForwardMessage )
// .... всякие обработчики ....
END_MSG_MAP()
// .... много всяких членов ....
LRESULT OnForwardMessage (
UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
{
MSG* pMsg = reinterpret_cast<MSG*>(lParam);
if ( webBrowserControl_.PreTranslateMessage(pMsg) )
return TRUE;
return CComCompositeControl<CHtmlEditControl>::IsDialogMessage(pMsg);
}
// .... много всяких членов ....
private:
WebBrowserControl webBrowserControl_;
}
Теперь, ежели вставить полученный ActiveX HtmlEditControl в вижуалстудийный ActiveX test container, то ни хрена не работает

Однако, если впихнуть его на хтмл страницу и отдать Интернет Эксплореру, или если поместить его в Outlook, то всё работает прекрасно. Собственно при написании приложения, использующего полученный ActiveX контрол, нужно придерживаться этой модели и посылать FORWARDMSG окну контрола во время фильтрации сообщений диалога, вот и всё.
Надеюсь, это поможет, или хотя бы навеет, какие-то мысли по поводу ...
Можно так же посетить следующие страницы:
Keyboard events handling in AXControl или
Hosting ActiveX Controls.
Если данный механизм не поможет, можно попытаться сделать, наподобие:
Tabs and Accelerators in ATL Modeless Dialogs.
С уважением, Rakafon.
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.