最近使用 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