我想在MFC屬性頁上託管.NET Windows窗體WebBrowser控件。爲此,我使用CWinFormsControls類。這一切都很好地工作,但由於我在屬性頁上,屬性表消耗TAB和RETURN鍵來執行導航或默認按鍵行爲,即在Web瀏覽器控制時按TAB鍵似乎有問題焦點不會將焦點移動到網頁中的下一個控件(頁面上有一個用戶名和密碼編輯框以及一個「提交」按鈕,我希望TAB在頁面上的各個框之間移動,並且要返回以提交) 。最終用戶不會滿意這種只有鼠標的行爲,所以我需要Web瀏覽器來處理TAB和RETURN鍵,而不是屬性表。在MFC屬性頁上的WebBrowser控件 - 需要處理TAB按鍵
經過一番研究 - 我是一個新手,當涉及到MFC和WinForms - 我認爲這個問題可能是屬性頁消費這些歸功於IsDialogMessage,在內部發送WM_GETDLGCODE消息給網絡密鑰瀏覽器和網頁瀏覽器只返回DLGC_WANTARROWS
和DLGC_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
,並不如預期的響應:
,我不能解釋,顯然不能解決問題。
那麼,我是怎麼回事?這個問題是否存在「正確」的解決方案?
我試過使用PreTranslateMessage來顯式攔截TAB和RETURN按鍵,並以某種方式(SendKeys API)將它們發送到Web瀏覽器控件。這適用於TAB鍵,但導致RETURN鍵的緩衝區溢出。所以在那裏沒有運氣,無論如何,它感覺像一個討厭的黑客。
這篇文章已經越來越長。如果你需要更多信息,那就問問。所有幫助非常感謝。