最近使用 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 编辑模式 监听键盘按键事件的更多相关文章

  1. python 在windows下监听键盘按键

    python 在windows下监听键盘按键 使用到的库 ctypes(通过ctypes来调用Win32API, 主要就是调用钩子函数) 使用的Win32API SetWindowsHookEx(), ...

  2. 如何在ArcMap中监听键盘鼠标事件(转)

    如何在ArcMap中监听键盘鼠标事件(转) Link: http://www.cnblogs.com/dyllove98/p/3155551.html 昨天有个朋友想要实现一个功能,就是在ArcMap ...

  3. 如何在ArcMap中监听键盘鼠标事件

    昨天有个朋友想要实现一个功能,就是在ArcMap中编辑数据的时候,能够通过快捷键自动设置预定义的属性,比如,选中若干要素,按A键,就自动填充属性,按B键,则又自动填充另外的属性字段. 单就这个功能而言 ...

  4. vue 监听键盘回车事件 @keyup.enter || @keyup.enter.native

    vue运行为v-on在监听键盘事件时,添加了特殊的键盘修饰符:\ <input v-on:keyup.13="submit"> vue还非常贴心地给出了常用按键的别名, ...

  5. unity监听键盘按键

    放在Update里面 if (Input.anyKeyDown) { foreach (KeyCode keyCode in Enum.GetValues(typeof(KeyCode))) { if ...

  6. JS 监听键盘按键

    1. 实现Ctrl+ Enter 组合键触发事件 document.onkeydown=function(event){ var keyNum = window.event ? event.keyCo ...

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

    虚模式填充常用来处理大量数据,某个字段的显示问题. DataGridView是.net 2.0新增的表格数据编辑和显示控件,简单的数据显示和编辑,只需直接和数据源绑定就可以了. 对于 一些特殊情况,我 ...

  8. vue在某页面监听键盘输入事件

    需求:在某一网页,通过上下左右键控制一些操作 实现: 1.基本代码: 因为没有绑定特定的元素.所以我们将事件绑定到document上. //当前页面监视键盘输入 document.onkeydown ...

  9. Vue监听键盘回车事件

    在写页面时遇见了登录页需要加一个键盘回车事件. vue 的 v-on中有这样的修饰符 <input v-on:keyup.enter="submit"> 即<in ...

随机推荐

  1. dual

    1. dual 确实是一张表.是一张只有一个字段,一行记录的表. 2.习惯上,我们称之为'伪表'.因为他不存储主题数据.3. 他的存在,是为了操作上的方便.因为select 都是要有特定对象的.如:s ...

  2. SparseArray,dip & px

    SparseArray-用Array的方式实现Integer-Object的map 优:节约内存,因为避免了装箱/拆箱,数据结构不依赖Entry 劣:速度不及HashMap dip.px dip(de ...

  3. vc 判断哪个按键 被按下 消息 按键 状态

    测试Numlock 是否是亮的 环境控制台程序: #include "stdafx.h" #include <stdio.h> #include <conio.h ...

  4. Flex应用一览表

    1.Flex控件之repeater和radioButton控件应用 2.Flex之DataGrid和Tree控件的数据源XML格式  3.Flex控件之combobox应用 4.转:Flex的Arra ...

  5. IIS装好了无法访问localhost

    解决办法:                 [1]:                 检查你的DTC服务(全名:Distributed Transaction Coordinator)是否可以正常启动 ...

  6. socket学习笔记——select与epoll函数的使用(linux)

    select.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <u ...

  7. USACO Section 4.4 追查坏牛奶Pollutant Control

    http://www.luogu.org/problem/show?pid=1344 题目描述 你第一天接手三鹿牛奶公司就发生了一件倒霉的事情:公司不小心发送了一批有三聚氰胺的牛奶.很不幸,你发现这件 ...

  8. 洛谷P1459 三值的排序 Sorting a Three-Valued Sequence

    P1459 三值的排序 Sorting a Three-Valued Sequence 166通过 369提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 那么 ...

  9. 09_platform-tools简介&常见adb指令

    SDK下面的文件夹说明add-ons 附加的附属的一些信息.docs Android开发的帮助文件.extras 支持的jar包,高版本兼容底版本.google usb的驱动.platforms 存放 ...

  10. Socket WSAAsyncSelect模型

    ::WSAAsyncSelect(sListen, hWnd, WM_SOCKET, FD_ACCEPT|FD_CLOSE); 自定义 WM_SOCKET消息 #include "../co ...