zoukankan      html  css  js  c++  java
  • Winform下WebBrowser 编辑模式 监听键盘按键事件

    最近使用 WebBrowser 做了个富文本编辑器(其实网上有很多很多)。例如下面这个玩意(不要在意界面神马的)

    WebBrowser在编辑模式下可以有一些HTML标签的功能,改变字体大小颜色等等等。。

    开启编辑模式->

    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的事件会报错:

    被告知WebBrowser是ActiveX控件不能添加此类事件。所以只有在mshtml中找找关于事件方面的东西

    在mshtml中有mshtml.HTMLDocumentClass或者直接使用 mshtml.HTMLDocumentEvents2_Event进行Dom的事件监听:

                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没有任何内容的话,添加事件后就会阻挡所有的按键传递。

    找到一个折中的办法,在添加事件之前往WebBrowser中写入一个空格:

    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);

    这个时候就可以进行键盘的按键监听了:

  • 相关阅读:
    dede标签:定义文件夹
    SendCloud邮件中为什么会显示代发
    中国天气网天气预报接口api
    话说TP框架里的Vendor这目录是干什么用的啊?类库扩展thinkphp3.1版本
    微信公众号tp3.2放进Model无效,几种实例化的方法试过,还是提示无法提供服务...
    WCF服务编程读书笔记(5):操作
    spingmvc relevent article
    testng
    sts 配置
    一个spring mvc 的例子,带源码的,
  • 原文地址:https://www.cnblogs.com/Skypurple/p/4228407.html
Copyright © 2011-2022 走看看