Мое приложение написано в WinApi, в котором отображается обработанный HTML в своем окне Для этого используется библиотека с COM-объектом ms html. Копирование текста по Ctrl + C не работает. Подклассная функция элемента управления не получает сообщения WM_KEYDOWN WM_CHAR, они потребляются в мс html. Поэтому я не могу получать события нажатия клавиш или ускорения клавиатуры. Я пробовал такие способы решить эту проблему
BEGIN_EVENTSINK_MAP(CHtmlWnd, CWnd)
ON_EVENT(CHtmlWnd, AFX_IDW_PANE_FIRST, 259 /* DocumentComplete */, OnDocumentComplete, VTS_DISPATCH VTS_PVARIANT)
END_EVENTSINK_MAP()
void CHtmlWnd::OnDocumentComplete(LPDISPATCH pDisp, VARIANT FAR* URL)
{
CComQIPtr<IDispatch> pHtml;
CComQIPtr<IHTMLDocument2> pHtmlDoc;
pHtml = m_wndBrowser.GetDocument();
if (pHtml)
{
pHtml.QueryInterface(&pHtmlDoc);
}
...
if (pHtml && m_sHTML.GetLength() && pHtmlDoc)
{
IDispatchPtr mouseclick = EventHandler<CHtmlWnd>::CreateHandler(this, &CHtmlWnd::MouseClick, DISPID_CLICK);
VARIANT vOnClick;
V_VT(&vOnClick) = VT_DISPATCH;
V_DISPATCH(&vOnClick) = mouseclick;
pHtmlDoc->put_onclick(vOnClick);
IDispatchPtr keyDown = EventHandler<CHtmlWnd>::CreateHandler(this, &CHtmlWnd::KeyDown, DISPID_KEYDOWN);
VARIANT vKeyDown;
V_VT(&vKeyDown) = VT_DISPATCH;
V_DISPATCH(&vKeyDown) = keyDown;
HRESULT res = pHtmlDoc->put_onkeydown(vKeyDown);
}
}
Здесь я использую события документа для пересылки KeyDown. Но определенная функция обратного вызова не вызывается.
BEGIN_MESSAGE_MAP(CHtmlWnd, CWnd)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_CONTEXTMENU()
ON_WM_HOTKEY()
ON_WM_KEYDOWN()
ON_WM_CHAR()
END_MESSAGE_MAP()
Также я попытался это тщетно. Это моя реализация COleControlSite и IDocHostUIHandler
class CCustomControlSite : public COleControlSite
{
public:
CCustomControlSite(COleControlContainer *pCnt):COleControlSite(pCnt){m_pWnd = NULL;}
CWnd* m_pWnd;
protected:
DECLARE_INTERFACE_MAP();
BEGIN_INTERFACE_PART(DocHostUIHandler, IDocHostUIHandler)
STDMETHOD(ShowContextMenu)(DWORD dwID,
POINT __RPC_FAR *ppt,
IUnknown __RPC_FAR *pcmdtReserved,
IDispatch __RPC_FAR *pdispReserved);
...
STDMETHOD(TranslateAccelerator)(
/* [in] */ LPMSG lpMsg,
/* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
/* [in] */ DWORD nCmdID);
TranslateAccelerator тоже не вызывается. Мне нужно получить в моем приложении сообщение windows, например WM_CHAR или WM_KEYBOARD, чтобы решить мою задачу. Буду очень признателен за любую помощь.