C#下的Webbrowser的KeyDown事件

来源:互联网 发布:移动4g网络接入点设置 编辑:程序博客网 时间:2024/05/19 11:50

最近在用Webbrowser开发一个富文本编辑器,一路磕磕碰碰,仅记录一下心得。

WebBrowser控件在编辑状态下,按下回车键后执行的是分段操作,相隔较大,Shift+回车是换行,两种行间距不一样。为了解决这个问题,倒是折腾了好几天。

在网上各种查找之后,几乎都是说用DIV标签来解决该问题,也就是编辑器初始时就直接把DIV嵌进去

<body>

<div> </div>

</body>

这样的话确实可以解决了该问题,回车之后就是新的DIV而不是换段落了,不过该方式有个问题,Ctrl+A全选后,再删除就会连带内部的DIV标签给删掉了,再回车又是一个P了。


接着继续研究,看到大牛提出来的,实现IDocHostUIHandler接口,按DOCHOSTUIFLAG_DIV_BLOCKDEFAULT的路子实现GetHostInfo方法。实现IDocHostUIHandler接口吧,查了半天,确实麻烦,先要生成MsHtmHstInterop.dll,用到的IDocHostUIHandler接口和ICustomDoc接口都是这个dll里边的,然后把IDocHostUIHandler接口的个人实现挂接到 MSHTML 上。

最郁闷的是,以上大牛都是用axWebbrowser来实现的,几经折腾,终于通过以下方式实现了IDocHostUIHandler接口:

// 把IDocHostUIHandler接口的个人实现挂接到 MSHTML 上
ICustomDoc cDoc = (ICustomDoc)this.webBrowser.Document.DomDocument;
cDoc.SetUIHandler((IDocHostUIHandler)this.webBrowser);

// IDocHostUIHandler 接口的实现,实现GetHostInfo
public void GetHostInfo(ref _DOCHOSTUIINFO pInfo)
{
    // DOCHOSTUIFLAG_DIV_BLOCKDEFAULT
    pInfo.dwFlags |= 0x00000100;
}

然而更杯具的事情发生了,编辑功能废了,也就是编辑模式下,任何按键都没反应,任何字符都敲不进去了.......

无奈之下,上坛子发帖去了,但一直没有得到回应,至今不知道我哪个地方错了,可能是我的接口实现有问题。

 

又回到之前思路,集中火力解决Ctrl+A全选后删除的问题。又碰到问题了,Webbrowser没有KeyDown,KeyPress相关的事件。

顿时觉得叫天不应叫地不灵...虽然偶是无神论者....

又接着憋屈,终于在内伤喷血之前.. 峰回路转,我找到了KeyDown事件!

Webbrowser本身是没有相关事件,但是HtmlElement有,而且webBrowser.Document.Body就是HtmlElement!

webBrowser.Document.Body.KeyDown += new HtmlElementEventHandler(Body_KeyDown);

 

虽然该问题还没有解决,但是算是多少有点进展了