最近使用 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. expdp导出数据库

    源地址:http://www.cnblogs.com/luluping/archive/2010/03/16/1687093.html 使用EXPDP和IMPDP时应该注意的事项: EXP和IMP是客 ...

  2. C++学习33 函数模板

    在<C++函数重载>一节中,为了求三个数的最大值,我们通过函数重载定义了三个名字相同.参数列表不同的函数,如下所示: //求三个整数的最大值 int max(int a, int b, i ...

  3. [POJ 1635] Subway tree systems (树哈希)

    题目链接:http://poj.org/problem?id=1635 题目大意:给你两棵树的dfs描述串,从根节点出发,0代表向深搜,1代表回溯. 我刚开始自己设计了哈希函数,不知道为什么有问题.. ...

  4. MS Sqlserver 备份数据库SQL

    通过作业的方式调用SQL执行自动备份,可以解决忘记备份数据库的问题,记录一下 declare @FileFullName varchar(40); declare @FileName varchar( ...

  5. 项目积累——SQL积累

    select sum(njts)-sum(ysyts) from njsyqk where ygdh='888882' and ((yxbz is null) or (yxbz='1')) selec ...

  6. MFC编译程序,缺少MFC动态链接库的解决

    MFC编译程序,缺少MFC动态链接库的解决 问题:VS2010 c++编写的程序在别人的机子运行不了,缺少mfc100u.dll xxx100d.dll等的解决方法 解决方法: 1.将这些dll打包, ...

  7. MFC学习 消息钩子使用

    HANDLE h_KeyBoard; //当前进程的钩子, 另外WH_KEYBOARD_LL, 与WH_MOUSE_LL参数时, 是获取的底层的消息, 相当于获取的全局的 g_hKeyBoard = ...

  8. Windows下cwRsync搭建步骤

    文章(一) CwRsync是基于cygwin平台的rsync软件包,支持windows对windows.windows对Linux.Linux对windows高效文件同步.由于CwRsync已经集成了 ...

  9. 关于litecoin莱特币挖矿、炒作的一点感想

    比特币早在一.二年前我就听说过这个词了,还自己试过搭设矿机,因为没找到显卡驱动,也没有人一起搞,所以中途放弃了. 后来就不断听说涨了多少倍,总想着都涨这么多了,错了也就错过了. 周二组会,一帮人兴起又 ...

  10. IBM Appscan基本操作手册

    一.操作前提 1.首先下载Appscan的安装包 2.安装Appscan 二.操作流程 1.双击图标,打开Appscan软件 2.打开软件后,页面显示如下: 3.选择“文件-新建”,弹出如下的窗口: ...