在我的应用程序中,我有一个嵌入式MSHTML控件。问题是我无法将焦点设置为此控件。我可以点击,选择,按下按钮等,但它不会接受键盘输入和鼠标滚轮通知。即使左键单击控件也不会设置焦点。 (该问题与此问题有关。

最终,我尝试了4种方法。 (为简洁起见,此处省略了错误处理。)第一种是将WM_SETFOCUS发送到控件。

HWND iehwnd = ::FindWindowEx (m_oleObjectHWND, NULL, 
     L"Shell DocObject View", NULL);
if(iehwnd != NULL)
{
    iehwnd = ::FindWindowEx (iehwnd, NULL, L"Internet Explorer_Server", NULL);
    if(iehwnd != NULL)
    {
        ::PostMessage(iehwnd, WM_SETFOCUS, (WPARAM)GetHWND(), NULL);
    }
}

使用Winspector,我确保消息传递到控件的窗口,但它似乎忽略了它们。

第二个是调用IHtmlWindow2的focus()方法。

    IHTMLDocument2* pHTMLDoc2 = NULL;
    m_webBrowser->get_Document((IDispatch**)&pHTMLDoc2);

    IHTMLWindow2* pWindow = 0;
    pHTMLDoc2->get_parentWindow(&pWindow);
    pWindow->focus();

这次,我从焦点()获得E_FAIL。

MSDN表示,当文档未加载时,调用可能会失败,但pHTMLDoc2 - <!> gt; get_readyState()返回<!>“完成<!>”。所以事实并非如此。

第三个是做UIACTIVATE动词。

    hret = m_oleObject->DoVerb(OLEIVERB_UIACTIVATE, NULL, 
        clientSite, 0, (HWND)GetHWND(), &posRect);

这似乎没有任何效果。

第四个是调用IHtmlDocument4的focus()。

    IDispatch* pdisp = NULL;
    m_webBrowser->get_Document((IDispatch**)&pdisp);

    IHTMLDocument4* pHTMLDoc4 = NULL;
    pdisp->QueryInterface(IID_IHTMLDocument4, (void**)(&pHTMLDoc4));

    pHTMLDoc4->focus();

什么都不做。

我已经花了整整一天的时间,现在已经明白了谷歌的链接:)希望得到专家的暗示。

有帮助吗?

解决方案

终于找到了它。

我的代码中的这个函数(或者更确切地说是wxWidgets库的IEHtmlWin组件)返回了S_FALSE。我将返回代码更改为S_OK - 并且瞧...

HRESULT FS_IOleInPlaceSiteWindowless :: RequestUIActivate() {     返回S_OK; }

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top