2014-05-02 14 views
1

我想在MFC屬性頁上託管.NET Windows窗體WebBrowser控件。爲此,我使用CWinFormsControls類。這一切都很好地工作,但由於我在屬性頁上,屬性表消耗TAB和RETURN鍵來執行導航或默認按鍵行爲,即在Web瀏覽器控制時按TAB鍵似乎有問題焦點不會將焦點移動到網頁中的下一個控件(頁面上有一個用戶名和密碼編輯框以及一個「提交」按鈕,我希望TAB在頁面上的各個框之間移動,並且要返回以提交) 。最終用戶不會滿意這種只有鼠標的行爲,所以我需要Web瀏覽器來處理TAB和RETURN鍵,而不是屬性表在MFC屬性頁上的WebBrowser控件 - 需要處理TAB按鍵

經過一番研究 - 我是一個新手,當涉及到MFC和WinForms - 我認爲這個問題可能是屬性頁消費這些歸功於IsDialogMessage,在內部發送WM_GETDLGCODE消息給網絡密鑰瀏覽器和網頁瀏覽器只返回DLGC_WANTARROWSDLGC_WANTCHARS,但關鍵是不是返回DLGC_WANTTAB。所以Web瀏覽器從不會看到TAB鍵來處理它。

所以我嘗試了很多東西,但最有前途的方法似乎是獲得來自web瀏覽器我自己的控件,然後重寫WndProc功能顯式處理WM_GETDLGCODE的消息,並要求TAB鍵:

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == 0x87 /* WM_GETDLGCODE */)   { 
     m.Result = (IntPtr)0x83; // DLGC_WANTARROWS|DLGC_WANTTAB|DLGC_WANTCHARS 
    } else { 
     base.WndProc(ref m); 
    } 
} 

這個函數確實被調用。但是,TAB鍵仍然不起作用。附加間諜++到Web瀏覽器窗口中顯示,儘管出現處理WM_GETDLGCODE,並不如預期的響應:

spy++ output

,我不能解釋,顯然不能解決問題。

那麼,我是怎麼回事?這個問題是否存在「正確」的解決方案?

我試過使用PreTranslateMessage來顯式攔截TAB和RETURN按鍵,並以某種方式(SendKeys API)將它們發送到Web瀏覽器控件。這適用於TAB鍵,但導致RETURN鍵的緩衝區溢出。所以在那裏沒有運氣,無論如何,它感覺像一個討厭的黑客。

這篇文章已經越來越長。如果你需要更多信息,那就問問。所有幫助非常感謝。

回答

0

經過一番研究,它似乎是更好的解決方案是從CPropertyPage得到我自己的類,並有覆蓋PreTranslateMessage爲:

BOOL CMyPage::PreTranslateMessage(MSG* pMsg) 
{ 
    return CDialog::PreTranslateMessage(pMsg); 
} 

即使屬性頁的行爲,就好像它是一個普通的對話框。原因是屬性頁面按照父屬性表來處理按鍵,如TAB和RETURN。

有了這個細微的變化,我的網絡瀏覽器控件獲得了所有按鍵並按照預期行事。