2008-11-18 90 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