2008-11-18 91 views
3

在我的应用程序中,我有一个嵌入式MSHTML控件。问题是我无法把重点放在这个控制上。我可以点击,选择,按下按钮等,但它不会接受键盘输入和鼠标滚轮通知。即使左键单击控件也不会设置焦点。 (该问题与this issue.有关)将焦点设置为嵌入式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-> 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(); 

什么都不做。

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

回答

2

终于找到了。

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

HRESULT FS_IOleInPlaceSiteWindowless :: RequestUIActivate() { return S_OK; }

+0

感谢您分享您的解决方案。我希望你给我的线索可以帮助我解决问题。 http://social.msdn.microsoft.com/Forums/en/wpf/thread/1b50fec6-6596-4c0a-9191-32cd059f18f7 – jpierson 2010-11-10 19:07:13