COM-объект MS HTML не копирует текст документа html в буфер обмена по Ctrl + C - PullRequest
1 голос
/ 23 апреля 2020

Мое приложение написано в 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, чтобы решить мою задачу. Буду очень признателен за любую помощь.

...