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 ...
随机推荐
- SQL 引用 webservice
sp_configure 'show advanced options', 1;GORECONFIGURE;GOsp_configure 'Ole Automation Procedures', 1; ...
- Address already in use: JVM_Bind<null>:8080错误的解决办法
myEclipse在启动tomcat时,有时候会出现8080端口被占用的情况, 提示这个错误:Address already in use: JVM_Bind<null>:8080. 按照 ...
- (Array) 一个 N*N 的矩阵,每一行从左到右有序,每一列从上到下有序,都是递增,写个程序,判断一个数是否在矩阵中。
int search(int d[N][N], int key) { int i1, i2, j1, j2; i1 = j1 = 0; i2 = j2 = N-1; while(i1 < i2 ...
- MapReduce从HBase读写数据简单示例
就用单词计数这个例子,需要统计的单词存在HBase中的word表,MapReduce执行的时候从word表读取数据,统计结束后将结果写入到HBase的stat表中. 1.在eclipse中建立一个ha ...
- SQL在指定列后添加新的列
ALTER TABLE `MR_CustomerShopFuture` ADD COLUMN `ProcessID` INT(11) DEFAULT '0' COMMENT '审核流程ID';
- Runtime机制之结构体及操作函数
一.动态语言 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:具有灵活性,比如:消息转发,方法交换等.它有一个运行时系统Ob ...
- CCJ PRML Study Note - Chapter 1.6 : Information Theory
Chapter 1.6 : Information Theory Chapter 1.6 : Information Theory Christopher M. Bishop, PRML, C ...
- Modifiers
Sometimes it is useful for a function to modify the objects it gets as parameters. In that case, the ...
- Ext.Net 破解
在使用 Ext.Net 框架时,如果没有得到正版授权(安装密钥),在站点发布后,打开界面总是弹出一个窗口,提示没有授权,看着都头疼,难道一定要安装密钥吗?但还是有办法解决的,在研究时发现,页面中多了两 ...
- nginx 配置.json文件直接访问
不要弹出下载 配置nginx.conf http { include mime.types; default_type application/json;