Winform下WebBrowser 編輯模式 監聽鍵盤按鍵事件

最近使用 WebBrowser 作了個富文本編輯器(其實網上有不少不少)。例以下面這個玩意(不要在乎界面神馬的)html

WebBrowser在編輯模式下能夠有一些HTML標籤的功能,改變字體大小顏色等等等。。web

開啓編輯模式->編輯器

webBrowser1.Url = new Uri("", UriKind.Relative);//這行保證Document不爲null

 if (webBrowser1.Document != null)
            {
                var doc = this.webBrowser1.Document.DomDocument as mshtml.IHTMLDocument2;
                if (doc != null)
                {
                    doc.designMode = "on";
                }
            }

各類命令以下->字體

        webBrowser.Document.ExecCommand([string],[bool],[object]);//編輯模式下使用

        private const string HTML_COMMAND_BOLD = "Bold";                       //加粗
        private const string HTML_COMMAND_UNDERLINE = "Underline";             //下劃線
        private const string HTML_COMMAND_ITALIC = "Italic";                   //斜體
        private const string HTML_COMMAND_SUBSCRIPT = "Subscript";             //下標
        private const string HTML_COMMAND_SUPERSCRIPT = "Superscript";         //上標
        private const string HTML_COMMAND_STRIKE_THROUGH = "StrikeThrough";    //刪除線
        private const string HTML_COMMAND_FONT_NAME = "FontName";              //字體
        private const string HTML_COMMAND_FONT_SIZE = "FontSize";              //字號
        private const string HTML_COMMAND_FORE_COLOR = "ForeColor";            //字體前景色
        private const string HTML_COMMAND_BACK_COLOR = "BackColor";            //字體背景色
        private const string HTML_COMMAND_INSERT_FORMAT_BLOCK = "FormatBlock"; //加粗
        private const string HTML_COMMAND_REMOVE_FORMAT = "RemoveFormat";      //清楚樣式
        private const string HTML_COMMAND_JUSTIFY_LEFT = "JustifyLeft";        //文本左對齊
        private const string HTML_COMMAND_JUSTIFY_CENTER = "JustifyCenter";    //文本中間對齊
        private const string HTML_COMMAND_JUSTIFY_RIGHT = "JustifyRight";      //文本右對齊
        private const string HTML_COMMAND_JUSTIFY_FULL = "JustifyFull";        //文本兩端對齊
        private const string HTML_COMMAND_INDENT = "Indent";                   //增大縮進量
        private const string HTML_COMMAND_OUTDENT = "Outdent";                 //減少縮進量
        private const string HTML_COMMAND_INSERT_LINE = "InsertHorizontalRule";//插入分割符
        private const string HTML_COMMAND_INSERT_LIST = "Insert{0}List"; // replace with (Un)Ordered 插入項目符號或項目編號
        private const string HTML_COMMAND_INSERT_IMAGE = "InsertImage";         //插入圖像
        private const string HTML_COMMAND_INSERT_LINK = "CreateLink";           //插入連接
        private const string HTML_COMMAND_REMOVE_LINK = "Unlink";               //移除連接
        private const string HTML_COMMAND_TEXT_CUT = "Cut";                     //剪切
        private const string HTML_COMMAND_TEXT_COPY = "Copy";                   //複製
        private const string HTML_COMMAND_TEXT_PASTE = "Paste";                 //粘貼
        private const string HTML_COMMAND_TEXT_DELETE = "Delete";               //刪除
        private const string HTML_COMMAND_TEXT_UNDO = "Undo";                   //撤銷
        private const string HTML_COMMAND_TEXT_REDO = "Redo";                   //恢復
        private const string HTML_COMMAND_TEXT_SELECT_ALL = "SelectAll";        //全選
        private const string HTML_COMMAND_TEXT_UNSELECT = "Unselect";           //取消選擇
        private const string HTML_COMMAND_TEXT_PRINT = "Print";                 // 打印
        private const string HTML_COMMAND_EDITMODE = "EditMode";                // 編輯模式
        private const string HTML_COMMAND_BROWSEMODE = "BrowseMode";            // 瀏覽模式
        private const string HTML_COMMAND_OVERWRITE = "OverWrite";             //轉換插入、覆寫模式

下面問題來了,當我編寫好東西后,習慣的按了Ctrl+S來進行保存,發現我應該作一個快捷鍵來保存,可是當添加WebBrowser的KeyUp的事件會報錯:this

被告知WebBrowser是ActiveX控件不能添加此類事件。因此只有在mshtml中找找關於事件方面的東西spa

在mshtml中有mshtml.HTMLDocumentClass或者直接使用 mshtml.HTMLDocumentEvents2_Event進行Dom的事件監聽:code

            mshtml.HTMLDocumentClass documentClass = webBrowser1.Document.DomDocument as mshtml.HTMLDocumentClass;
            documentClass.HTMLDocumentEvents2_Event_onkeyup += new mshtml.HTMLDocumentEvents2_onkeyupEventHandler(documentClass_HTMLDocumentEvents2_Event_onkeyup);
            documentClass.HTMLDocumentEvents_Event_onkeyup += new mshtml.HTMLDocumentEvents_onkeyupEventHandler(documentClass_HTMLDocumentEvents_Event_onkeyup);

            HTMLDocumentEvents2_Event docEvents = webBrowser1.Document.DomDocument as HTMLDocumentEvents2_Event;
            docEvents.onkeyup += new HTMLDocumentEvents2_onkeyupEventHandler(docEvents_onkeyup);
            docEvents.onkeydown += new HTMLDocumentEvents2_onkeydownEventHandler(docEvents_onkeydown);
            docEvents.onkeypress += new HTMLDocumentEvents2_onkeypressEventHandler(docEvents_onkeypress);

可是添加事件後問題又來了,WebBrowser雖然處於編輯模式,卻沒法寫入任何東西。猜想是在事件添加以前WebBrowser沒有任何內容的話,添加事件後就會阻擋全部的按鍵傳遞。orm

找到一個折中的辦法,在添加事件以前往WebBrowser中寫入一個空格:htm

var docEdit = webBrowser1.Document.DomDocument as IHTMLDocument2;
            if (docEdit != null)
            {
                docEdit.write(" ");
                docEdit.close();
            }
            mshtml.HTMLDocumentClass documentClass = webBrowser1.Document.DomDocument as mshtml.HTMLDocumentClass;
            documentClass.HTMLDocumentEvents2_Event_onkeyup += new mshtml.HTMLDocumentEvents2_onkeyupEventHandler(documentClass_HTMLDocumentEvents2_Event_onkeyup); documentClass.HTMLDocumentEvents_Event_onkeyup += new mshtml.HTMLDocumentEvents_onkeyupEventHandler(documentClass_HTMLDocumentEvents_Event_onkeyup);
            HTMLDocumentEvents2_Event docEvents = webBrowser1.Document.DomDocument as HTMLDocumentEvents2_Event; 
docEvents.onkeyup
+= new HTMLDocumentEvents2_onkeyupEventHandler(docEvents_onkeyup);
docEvents.onkeydown
+= new HTMLDocumentEvents2_onkeydownEventHandler(docEvents_onkeydown);
docEvents.onkeypress
+= new HTMLDocumentEvents2_onkeypressEventHandler(docEvents_onkeypress);

這個時候就能夠進行鍵盤的按鍵監聽了:blog

相關文章
相關標籤/搜索