BHO,C#实现了超级拖拽的效果。

分类: C# 2013-12-10 22:49 167人阅读 评论(0) 收藏 举报

BHO

我一般习惯用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即可(没有就加上),但需要注意的是,加上了后会导致每个窗口一个独立的进程的功能实现,如果你喜欢这个功能,在用的时候吧这个值给删掉即可。

BHO,C#实现了超级拖拽的效果相关推荐

  1. react实现的点击拖拽元素效果

    之前用vue做日程管理组件的时候,用到了点击拖拽的效果,即点击元素,鼠标移动到哪里,元素移动到哪里,鼠标松开,拖拽停止,现在在弄react,于是也在想实现这个效果,经过一番折腾,效果出来了,代码如下: ...

  2. 贝塞尔曲线(Bezier)之 QQ 消息拖拽动画效果

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  3. android qq消息数 拖拽动画,史上最详细仿QQ未读消息拖拽粘性效果的实现

    好久没写文章了,前段时间由于项目代码重构忙了一段时间,现在终于有点时间了就为大家带来一篇关于动画学习的自定义View:类似QQ消息拖拽的效果. 其实QQ当时更新的时候我还没注意到这个小红点是可以拖拽的 ...

  4. 利用jQuery UI为CMS网站实现拖拽布局效果,秒杀table布局

    1 实现效果 对于使用过CMS系统制作网站的人应该都清楚,制作网站过程有一个重要的步骤就是制作页面布局.目前,实现页面布局有两种方式:table与div.这两种方式各有其优劣之处. Table: 优势 ...

  5. android开发之仿QQ拖拽界面效果(侧滑面板)

    仿QQ拖拽界面效果(侧滑面板),我们一般继承Layout,不会直接去继承ViewGroup,而是继承FrameLayout,为什么五大布局我们偏偏只继承FrameLayout呢? 第一,FrameLa ...

  6. Android qq消息气泡实现效果,Android 实现仿QQ拖拽气泡效果的示例

    效果图: 一.实现思路 在列表中默认使用自定义的TextView控件来展示消息气泡,在自定义的TextView控件中重写onTouchEvent方法,然后在DOWN.MOVE.UP事件中分别处理拖拽效 ...

  7. ToolStrip控件左右拖拽移动效果实现

    1.主窗体下部添加一个Panel乘放ToolStrip控件以实现ToolStrip在窗体下部定位. 2.当ToolStrip控件中子控件超出屏幕时,拖动控件可以实现滑动效果.拖动到控件边缘距窗体边缘1 ...

  8. 手把手实现腾讯qq拖拽删去效果(二)

    这节,就一个任务如何把上节自定义的翻页动画控件整进下拉列表中去. 由于是自定义的下拉列表控件,我们需要自定义能够上啦下滑的listview,这势必会造成这个问题,上拉刷新要响应相应touch事件,拖拽 ...

  9. html实现拖拽排序,简单的jquery拖拽排序效果实现代码

    步骤: 1.实现随鼠标移动的效果: 2.初始化一个元素及其坐标: 3.拖拽对象的最后坐标,与元素的坐标 进行计算和判断 来确定 要插入的目标元素: 4.用insertBefore 方法 插入到目标元素 ...

最新文章

  1. java元婴期(19)----java进阶(spring(3)----AOP相关概念实现方式)
  2. 解决datagrid单元格不能设置100%问题
  3. 无招胜有招之Java进阶JVM(六)JVM 参数及调优
  4. KUKA profesafe
  5. BootstrapTable入门Demo
  6. Redis 6 将采用全新协议 RESP3,以提供客户端缓存功能
  7. pytorch里的nn.Embedding是什么东西?
  8. 汇编调用C函数--利用堆栈传递参数
  9. 查看apt-get安装软件的版本
  10. DHCP服务在企业网络中的应用
  11. java9最新下载_java9 64位 官方下载_java9 64位 官方最新版_魅蓝下载
  12. Free Dwg Viewer-免费的AutoCAD DWG/DWF/DXF文件查看器
  13. 苹果错误分析报告preferreuserinterface_20182019年苹果产业链分析报告
  14. Buck_Boost电路分析 亲测
  15. 16进制地址编码速算内存容量
  16. cd/etc 文件目录浅解
  17. firefox html5 pop,数组的push、unshift、pop、shift方法实现
  18. 三小时学会css(菜鸟教程精华版)【中】
  19. SAP中统驭科目理解及举例
  20. LOJ 10155. 「一本通 5.2 例 3」数字转换

热门文章

  1. java+criteriaquery_elasticsearch CriteriaQuery查询例子
  2. 拼图游戏--更改项目后的需求分析
  3. android安装Mysql服务,android手机可以作为mysql的服务器
  4. WEB网站的注册、登录、验证码
  5. css 绘制直角梯形 和 平行四边形
  6. 【为谁痴来为谁狂?为谁两眼泪汪汪?】
  7. 腾讯为Facebook发布QQ Chat
  8. a+'0' 和 a-'0'的区别
  9. Mac终端修改主机名
  10. 喜欢一个人和爱一个人的区别