用C#写了个x64版IE9的BHO,实现了超级拖拽的效果。
2011-03-12 11:21
232 查看
我一般习惯用IE,以前一直是搭配着IEPRO用的,主要用里面的鼠标手势等一些辅助功能。后来换了x64的win7后,它在x64下的IE不工作了,虽然找到了一款可以在x64的IE下使用鼠标手势软件,但它功能较单一,缺少我常用的超级拖拽和双击TAB关闭的功能,由于它是开源的,我曾经尝试过在它的代码里加上这两个功能,令我十分诧异的是,虽然景德镇里BHO相关的软件漫山遍野,一个不留神就踩上了几个,但网上BHO开发相关的文章资料却少得可怜,加上我对com完全没有接触过,被那套框架绕得晕头转向,摸索了一天后也没有啥进展,就干脆放弃了。
昨天看到园子里有人在介绍的新版Microsoft All-In-One Code Framework,看了一下,发现里面有两个用C#写的BHO的例子,基本上是一看就懂,就在它的例子上,改吧改吧,基于CSBrowserHelperObject这个工程,实现了超级拖拽的功能。关于BHO的架构可以参看MSDN,网上也有中文译本的,这里就不多介绍了,只是谈一下超级拖拽的实现。
超级拖拽主要是对文本和链接实现了鼠标拖拽的附加功能,从而能快速打开链接,减少右键菜单那繁琐的操作,以下是代码:
public HTMLDocumentEventHelper(HTMLDocument document)
{
this.document = document;
this.ondragstart += e => e.returnValue = true;
var rootElementEvents = document.documentElement as HTMLElementEvents_Event;
rootElementEvents.ondragover += () => false;
rootElementEvents.ondrop += () => { SuperDragDrop(); return false; };
}
void SuperDragDrop()
{
var eventObj = document.parentWindow.@event as IHTMLEventObj2;
//拖拽的是链接,在新窗口中打开链接
var url = (object)eventObj.dataTransfer.getData("URL") as string;
if (!string.IsNullOrEmpty(url))
{
InternetExplorer.Navigate2(url, BrowserNavConstants.navOpenInBackgroundTab);
return ;
}
//拖拽的是选择的文本,则用google搜索改文本
var text = (object)eventObj.dataTransfer.getData("TEXT") as string;
if (!string.IsNullOrEmpty(text))
{
if (text.StartsWith("http://", System.StringComparison.OrdinalIgnoreCase)) //未被识别的超链接
{
InternetExplorer.Navigate2(text, BrowserNavConstants.navOpenInBackgroundTab);
}
else //待搜索的文本
{
InternetExplorer.Navigate2(string.Format("http://www.google.com.hk/search?hl=zh-CN&q={0}", text)
, BrowserNavConstants.navOpenInBackgroundTab);
}
return ;
}
return ;
}
从代码里可以看出,和在winform下实现拖拽支持基本上一样,只要实现startdrag,ondrag及ondrop这三个事件的回调即可,非常简单。超级拖拽的具体功能用C#实现起来自然也是轻而易举。
看了一下它的mshtml的那个库,主要还是用dynamic来简化和com之间的交互的,通过它简化后,用C#实现起来比用C++简单太多了,在搞清楚了BHO的架构和摸索出那些函数的用法之后,实现的过程是非常轻松的,本想一鼓作气把双击TAB关闭的功能也实现了的,查了半天也没有找打合适的方案,大致的意思都是这个功能只能通过winapi去实现,在bho中并没有相关接口,由于winapi也是我不熟悉的地方,就暂时搁置下了,等下次有空再摸索一下。
这里顺便把开发的过程中遇到的几个问题也记录一下:
1、64位IE的插件开发方法:
开发64位BHO和32位的没有什么区别,只需要在Visual Studio x64 Win64 命令提示下执行安装的命令Regasm即可,当然,前提是你要安x64的c++编译器。
2、BHO无法调试的解决方法:
遇到调试BHO无法打断点时,将注册表HKCU/Software/Microsoft/Internet Explorer/Main/TabProcGrowth的值设置为0即可(没有就加上),但需要注意的是,加上了后会导致每个窗口一个独立的进程的功能实现,如果你喜欢这个功能,在用的时候吧这个值给删掉即可。
昨天看到园子里有人在介绍的新版Microsoft All-In-One Code Framework,看了一下,发现里面有两个用C#写的BHO的例子,基本上是一看就懂,就在它的例子上,改吧改吧,基于CSBrowserHelperObject这个工程,实现了超级拖拽的功能。关于BHO的架构可以参看MSDN,网上也有中文译本的,这里就不多介绍了,只是谈一下超级拖拽的实现。
超级拖拽主要是对文本和链接实现了鼠标拖拽的附加功能,从而能快速打开链接,减少右键菜单那繁琐的操作,以下是代码:
public HTMLDocumentEventHelper(HTMLDocument document)
{
this.document = document;
this.ondragstart += e => e.returnValue = true;
var rootElementEvents = document.documentElement as HTMLElementEvents_Event;
rootElementEvents.ondragover += () => false;
rootElementEvents.ondrop += () => { SuperDragDrop(); return false; };
}
void SuperDragDrop()
{
var eventObj = document.parentWindow.@event as IHTMLEventObj2;
//拖拽的是链接,在新窗口中打开链接
var url = (object)eventObj.dataTransfer.getData("URL") as string;
if (!string.IsNullOrEmpty(url))
{
InternetExplorer.Navigate2(url, BrowserNavConstants.navOpenInBackgroundTab);
return ;
}
//拖拽的是选择的文本,则用google搜索改文本
var text = (object)eventObj.dataTransfer.getData("TEXT") as string;
if (!string.IsNullOrEmpty(text))
{
if (text.StartsWith("http://", System.StringComparison.OrdinalIgnoreCase)) //未被识别的超链接
{
InternetExplorer.Navigate2(text, BrowserNavConstants.navOpenInBackgroundTab);
}
else //待搜索的文本
{
InternetExplorer.Navigate2(string.Format("http://www.google.com.hk/search?hl=zh-CN&q={0}", text)
, BrowserNavConstants.navOpenInBackgroundTab);
}
return ;
}
return ;
}
从代码里可以看出,和在winform下实现拖拽支持基本上一样,只要实现startdrag,ondrag及ondrop这三个事件的回调即可,非常简单。超级拖拽的具体功能用C#实现起来自然也是轻而易举。
看了一下它的mshtml的那个库,主要还是用dynamic来简化和com之间的交互的,通过它简化后,用C#实现起来比用C++简单太多了,在搞清楚了BHO的架构和摸索出那些函数的用法之后,实现的过程是非常轻松的,本想一鼓作气把双击TAB关闭的功能也实现了的,查了半天也没有找打合适的方案,大致的意思都是这个功能只能通过winapi去实现,在bho中并没有相关接口,由于winapi也是我不熟悉的地方,就暂时搁置下了,等下次有空再摸索一下。
这里顺便把开发的过程中遇到的几个问题也记录一下:
1、64位IE的插件开发方法:
开发64位BHO和32位的没有什么区别,只需要在Visual Studio x64 Win64 命令提示下执行安装的命令Regasm即可,当然,前提是你要安x64的c++编译器。
2、BHO无法调试的解决方法:
遇到调试BHO无法打断点时,将注册表HKCU/Software/Microsoft/Internet Explorer/Main/TabProcGrowth的值设置为0即可(没有就加上),但需要注意的是,加上了后会导致每个窗口一个独立的进程的功能实现,如果你喜欢这个功能,在用的时候吧这个值给删掉即可。
相关文章推荐
- BHO,C#实现了超级拖拽的效果
- C# 实现 treeView 控件 拖拽效果
- C#编写的IE9使用的超级拖拽插件
- C#中ListBox和ListView的透明及内容居中效果实现
- React.js实现原生js拖拽效果及思考
- C#TextBox控件拖拽实现获得文件路径
- winform(C#)拖拽实现获得文件路径
- javascript实现PC网页里的拖拽效果
- HTML5 canvas实现移动端上传头像拖拽裁剪效果
- 拖拽效果的实现原理分析2
- JS实现简单拖拽效果
- 在Windows ce中为Silverlight元件注册手势事件以实现拖拽效果
- 轮播banner,实现旋转木马效果,Galler 效果,可无限循环自动播放、拖拽
- js源代码实现拖拽效果
- C#用ComboBox控件实现省与市的联动效果的方法
- c#实现控件拖动效果
- WinForm实现简单的拖拽功能(C#)(2)
- C#实现具有Aero效果的窗体
- C#实现窗体的淡入淡出效果
- jq实现简单的拖拽效果