Winform下WebBrowser 编辑模式 监听键盘按键事件

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

WebBrowser在编辑模式下可以做一些类似Word文档的操作,改变字体大小颜色等等等。。

开启编辑模式->

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

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

时间: 2024-10-09 10:10:23

Winform下WebBrowser 编辑模式 监听键盘按键事件的相关文章

python 在windows下监听键盘按键

python 在windows下监听键盘按键 使用到的库 ctypes(通过ctypes来调用Win32API, 主要就是调用钩子函数) 使用的Win32API SetWindowsHookEx(), 将用户定义的钩子函数添加到钩子链中, 也就是我们的注册钩子函数 UnhookWindowsHookEx(), 卸载钩子函数 CallNextHookEx()在我们的钩子函数中必须调用, 这样才能让程序的传递消息 在没有钩子函数的情况下windows程序运行机制 键盘输入 --> 系统消息队列 --

关于ivx监听键盘按键的经验总结

之前的帖子里讲了ivx中很多组件都可以监听到鼠标的移入移出事件,还包括最常用的点击事件,其实我们也可以在案例中监听到键盘的按键操作,例如这个demo中我们可以在输入框内输入一些文本信息,然后点击send按钮或者直接敲击键盘Enter回车键就会在上方添加我们刚刚输入的内容.下面来说一下具体的实现方法.1.很显然上面的输入信息的展示用到了循环创建,我们需要一个数组来存放全部输入的信息,这个demo比较简单添加一个一位数组即可.2.接下来我们要做的就是在点击send按钮或者敲击Enter回车时将输入框

winform DataGridView的虚模式填充,CellValueNeeded事件的触发条件

虚模式填充常用来处理大量数据,某个字段的显示问题. DataGridView是.net 2.0新增的表格数据编辑和显示控件,简单的数据显示和编辑,只需直接和数据源绑定就可以了. 对于 一些特殊情况,我们需要自己填充DataGridView,这时候只需要按照行列顺序,首先获得行,然后通过行的Cells属性,得到单元格,设置其 Value属性即可.但这种模式有个问题,即对于几十行或者几百行的数据,显示效率不是问题,当数据量逐渐增大时,效率就成了一个非常重要的问题. 那么,如何解决这样的问题呢,写过或

js监听键盘方向键事件

<SCRIPT language=javascript> document.onkeydown = chang_page; function chang_page() { if (event.keyCode == 37 || event.keyCode == 33) location = 'http://www.maitianquan.com'; if (event.keyCode == 39 || event.keyCode == 34) location = 'http://www.lan

delphi 11 编辑模式 浏览模式

编辑模式 浏览模式 设置焦点 //在使用前需要Webbrowser已经浏览过一个网页 否则错误 uses MSHTML; ///获取Webbrowser编辑模式里面的内容 procedure EditMode();begin  (Form1.WebBrowser1.Document as IHTMLDocument2).designMode := 'on';end;//----------------------------------------------------------------

XAF-列表视图编辑模式

下面来看看XAF中列表有哪些编辑模式: 一.inline编辑 下图说明了WinForms和ASP.NET应用程序中的可编辑列表视图. 在win中,这个很友好,就像excel中编辑一样.5星功能^_^. 在web中,还需要点击一个按钮,这个个人感觉和弹出窗口没啥区别.当然,还是能够看到别的记录的信息,勉强用吧. 如何设置? 在VS中找到xafml文件,找到指定的列表视图 设置AllowEdit属性为真. 如果要允许新建功能,则需要设置AllowNew属性为真和IModelListViewNewIt

easyui-datagrid 编辑模式详解

   一,建立编辑器 从api得知,扩展一种新的编辑器类型,需要提供以上几个方法.项目中正好需要一个checkbox 类型编辑器,但在easyui中并没提供这样的编辑器,那我们可以通过扩展编辑器来解决,扩展如下 1 $.extend($.fn.datagrid.defaults.editors, { 2 checkbox: {//调用名称 3 init: function (container, options) { 4 //container 用于装载编辑器 options,提供编辑器初始参数

swift 监听键盘弹出的高度

// 监听键盘通知 NotificationCenter.default.addObserver(self, selector: #selector(ComposeViewController.keyboardWillChangeFrame(note:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil) //监听键盘的事件 func keyboardWillChangeFrame(note: Notificat

编辑模式下,控制对象移动

有时候我们可能会有这样的需求,就是在编辑模式下,控制移动场景中的物体,这里面有两个点要解决: (1)怎么在编辑模式下运行一个脚本: (2)怎么有效地响应鼠标按键. 第一个问题可以使用编辑器属性ExecuteInEditMode让脚本在编辑模式也能实时地更新.下面的代码用来控制物体的移动,并且可以在编辑模式下运行: using UnityEngine; using System.Collections; #if UNITY_EDITOR using UnityEditor; #endif [Exe