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);
这个时候就可以进行键盘的按键监听了:

Winform下WebBrowser 编辑模式 监听键盘按键事件的更多相关文章
- python 在windows下监听键盘按键
python 在windows下监听键盘按键 使用到的库 ctypes(通过ctypes来调用Win32API, 主要就是调用钩子函数) 使用的Win32API SetWindowsHookEx(), ...
- 如何在ArcMap中监听键盘鼠标事件(转)
如何在ArcMap中监听键盘鼠标事件(转) Link: http://www.cnblogs.com/dyllove98/p/3155551.html 昨天有个朋友想要实现一个功能,就是在ArcMap ...
- 如何在ArcMap中监听键盘鼠标事件
昨天有个朋友想要实现一个功能,就是在ArcMap中编辑数据的时候,能够通过快捷键自动设置预定义的属性,比如,选中若干要素,按A键,就自动填充属性,按B键,则又自动填充另外的属性字段. 单就这个功能而言 ...
- vue 监听键盘回车事件 @keyup.enter || @keyup.enter.native
vue运行为v-on在监听键盘事件时,添加了特殊的键盘修饰符:\ <input v-on:keyup.13="submit"> vue还非常贴心地给出了常用按键的别名, ...
- unity监听键盘按键
放在Update里面 if (Input.anyKeyDown) { foreach (KeyCode keyCode in Enum.GetValues(typeof(KeyCode))) { if ...
- JS 监听键盘按键
1. 实现Ctrl+ Enter 组合键触发事件 document.onkeydown=function(event){ var keyNum = window.event ? event.keyCo ...
- winform DataGridView的虚模式填充,CellValueNeeded事件的触发条件
虚模式填充常用来处理大量数据,某个字段的显示问题. DataGridView是.net 2.0新增的表格数据编辑和显示控件,简单的数据显示和编辑,只需直接和数据源绑定就可以了. 对于 一些特殊情况,我 ...
- vue在某页面监听键盘输入事件
需求:在某一网页,通过上下左右键控制一些操作 实现: 1.基本代码: 因为没有绑定特定的元素.所以我们将事件绑定到document上. //当前页面监视键盘输入 document.onkeydown ...
- Vue监听键盘回车事件
在写页面时遇见了登录页需要加一个键盘回车事件. vue 的 v-on中有这样的修饰符 <input v-on:keyup.enter="submit"> 即<in ...
随机推荐
- rsync 目录 斜杠
源: 不带:同步 目录和内容 带/: 只同步内容 target目录: 待. -Warv --delete -W, --whole-file copy files whole ( ...
- 微信中得到的GPS经纬度放在百度,腾迅地图中不准的原因及处理
微信中可以得到两种GPS坐标信息 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02' 一种是全球的正常GPS坐标信息 wgs84 . GPS,W ...
- spring mvc中的json整合
spring mvc整合过程中是有版本兼容的问题.具体的哪个版本的springmvc和哪个个版本的json包冲突我也无从考证了.我用的springmvc版本是3.2.1jaskson的版本是 1.1. ...
- easyui tabs内容panel自适应窗体宽度方法
废话不说,直接上代码: $('#Teacherwin_details').window({ title: '查看教职工信息', width: 800, height: 520, top: ($(win ...
- centos 下安装.net core
先要安装libunwind, libunwind库为基于64位CPU和操作系统的程序提供了基本的堆栈辗转开解功能,32位操作系统不要安装.其中包括用于输出堆栈跟踪的API.用于以编程方式辗转开解堆栈的 ...
- ubuntu搭建分布式hadoop-2.6.0概略和错误
详细配置:http://blog.csdn.net/ggz631047367/article/details/42426391 1.修改机器/etc/hostname分别为 master s ...
- django models 建立好后,table也创建成功了,为什么网页后台不显示的问题
刚学,遇到这个问题,所以向大神请教,大神给了两个词,admin ,register.感觉像被雷击中了一样,原来忘记了,注册(register) 解决方法就是:在admin.py中对你的model进行注 ...
- Android 在程序中动态添加 View 布局或控件
有时我们需要在程序中动态添加布局或控件等,下面用程序来展示一下相应的方法: 1.addView 添加View到布局容器 2.removeView 在布局容器中删掉已有的View 3.LayoutPar ...
- 云计算PAAS平台测试设计之镜像管理
下面是云计算PAAS平台页面概览: 今天我们要讲的是镜像管理页面的测试设计: 可以看到,这个页面主要有增删改查四个功能. 1. 查询镜像 (1)易用性:查看镜像查询界面,界面上各组件设计合理.美观.易 ...
- Unity项目在亚马逊KindleFire设备上旋转不正确的解决方案
前提: 在亚马逊设备上,总部要求发布的版本必须使用LandscapeLeft方向.按照经验,在UnityPlayerSettings中设置Orientation即可. 问题表现: ...