使用C#编写BHO实现残障人群上网冲浪无障碍

 原文发表于作者博客 http://www.nod6.net——以c#和Objective-C为主题的网站。

 

先看一个效果图:

位于下方的工具栏即是我们编写的BHO组件。它本质上是一个DLL,是由IE浏览器加载的,它的生命周期=浏览器进程的生命周期。更多关于BHO的信息,请大家自行Google。IE8是多进程浏览器,因此没打开一个选项卡,或者每打开一个新的窗口就会启动这样一个BHO组件。那么,IE是如何知道要加载哪些BHO呢?答案是:注册表。注册表是Windows最重要的配置数据库,BHO的配置也不例外,它位于注册表的如下位置:

Software/Microsoft/Windows/CurrentVersion/Explorer/Browser Helper Objects

因此,我们只需要编写一个bat文件注册即可:

C:/Windows/Microsoft.NET/Framework/v4.0.30319/regasm /codebase “bin/Debug/MyBHO.dll”

那么,接下来我们关注下BHO本身,如何编写一个BHO组件呢?很简单,只需4步即可搞定:

1、编写一个接口:

 using System;

using System.Runtime.InteropServices;

namespace MyBHO

{

    [

    ComVisible(true),

    InterfaceType(ComInterfaceType.InterfaceIsIUnknown),

    Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")

    ]

    public interface IObjectWithSite

    {

        [PreserveSig]

        int SetSite([MarshalAs(UnmanagedType.IUnknown)]Object site);

        [PreserveSig]

        int GetSite(ref Guid guid, out IntPtr ppvSite);

    }

}

2、实现该接口

 [

ComVisible(true),

Guid("B4BC397F-B34**A79-972F-1B4D6D81DA1E"),

ClassInterface(ClassInterfaceType.None)

]

public class FirstBHO : IObjectWithSite

{

       //...

}

3、生成证书,并将证书应用到该BHO项目

“C:/Program Files/Microsoft SDKs/Windows/v7.0A/bin/NETFX 4.0 Tools/sn”  -k MyBHO.key

4、注册安装。
public int SetSite(object site)
{
if (site != null)
{
_webBrowser = site as WebBrowser;
if (_webBrowser != null)
{
DocumentComplete += _form.OnDocumentComplete;
_form.Gray += new EventHandler(_form_Gray);
_form.Reload += new EventHandler(_form_Reload);
_form.Restore += new EventHandler(_form_Restore);
_form.ZoomIn += new EventHandler(_form_ZoomIn);
_form.Zoom += new BHOForm.ZoomDelegate(_form_Zoom);
_form.Invert += new EventHandler(_form_Invert);
_form.XRay += new EventHandler(_form_XRay);
_form.Speech += new EventHandler(_form_Speech);
_form.StopSpeech += new EventHandler(_form_StopSpeech);
_webBrowser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(webBrowser_DocumentComplete);
}
}
else
{
if (_webBrowser != null)
{
_webBrowser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(webBrowser_DocumentComplete);
_webBrowser = null;
}
}
return 0;
}
其中第2步,需要重点关注SetSite方法,如下:
public int SetSite(object site)
{
if (site != null)
{
_webBrowser = site as WebBrowser;
if (_webBrowser != null)
{
DocumentComplete += _form.OnDocumentComplete;
_form.Gray += new EventHandler(_form_Gray);
_form.Reload += new EventHandler(_form_Reload);
_form.Restore += new EventHandler(_form_Restore);
_form.ZoomIn += new EventHandler(_form_ZoomIn);
_form.Zoom += new BHOForm.ZoomDelegate(_form_Zoom);
_form.Invert += new EventHandler(_form_Invert);
_form.XRay += new EventHandler(_form_XRay);
_form.Speech += new EventHandler(_form_Speech);
_form.StopSpeech += new EventHandler(_form_StopSpeech);
_webBrowser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(webBrowser_DocumentComplete);
}
}
else
{
if (_webBrowser != null)
{
_webBrowser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(webBrowser_DocumentComplete);
_webBrowser = null;
}
}
return 0;
}

至于界面,只需要新建一个Form就可以了,Form里没有任何业务逻辑(业务逻辑在FirstBHO中),只是一个人机接口而已。
至于Form和业务逻辑类FirstBHO的交互,是通过事件实现的。下面给出Form的代码:

 

using System;
using System.Windows.Forms;
 
namespace MyBHO
{
    public partial class BHOForm : Form
    {
        public delegate void ZoomDelegate(object sender, ZoomEventArgs e);
 
        public event EventHandler ZoomIn;
        public event EventHandler Gray;
        public event EventHandler Reload;
        public event EventHandler Restore;
        public event EventHandler Invert;
        public event ZoomDelegate Zoom;
        public event EventHandler XRay;
        public event EventHandler Speech;
        public event EventHandler StopSpeech;
 
        public BHOForm()
        {
            InitializeComponent();
        }
 
        public void OnDocumentComplete(object sender, BHOEventArgs e)
        {
            if (!this.Visible)
            {
                this.Show();
            }
 
            this.textBox1.Text = e.Data as string;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            ZoomIn(this, new EventArgs());
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            Gray(this, new EventArgs());
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            Reload(this, new EventArgs());
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            Restore(this, new EventArgs());
        }
 
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            Zoom(this, new ZoomEventArgs { ZoomValue = trackBar1.Value * 10 });
        }
 
        private void button5_Click(object sender, EventArgs e)
        {
            Invert(this, new EventArgs());
        }
 
        private void button6_Click(object sender, EventArgs e)
        {
            XRay(this, new EventArgs());
        }
 
        private void BHOForm_Load(object sender, EventArgs e)
        {
            Height = 80;
            textBox1.Visible = false;
            CalcWinLocation();
        }
 
        private void CalcWinLocation()
        {
            Top = Screen.PrimaryScreen.WorkingArea.Height - Height - 10;
            Left = (Screen.PrimaryScreen.WorkingArea.Width - Width) / 2;
        }
 
 
        private void button7_Click(object sender, EventArgs e)
        {
            Speech(this, new EventArgs());
        }
 
        private void button8_Click(object sender, EventArgs e)
        {
            StopSpeech(this, new EventArgs());
        }
 
        private void BHOForm_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (Height == 80)
            {
                Height = 300;
                textBox1.Visible = true;
            }
            else if (Height == 300)
            {
                Height = 80;
                textBox1.Visible = false;
            }
            CalcWinLocation();
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
BHO(Browser Helper Object,浏览器辅助对象,简称BHO)   BHO是微软推出的作为浏览器对第三方程序员开放交互接口的业界标准,通过简单的代码就可以进入浏览器领域的“交互接口”(INTERACTIVED Interface)。通过这个接口,程序员可以编写代码获取浏览器的行为,比如“后退”、“前进”、“当前页面”等,利用BHO的交互特性,程序员还可以用代码控制浏览器行为,比如修改替换浏览器工具栏,添加自己的程序按钮等。这些在系统看来都是没有问题的。BHO原来的目的是为了更好的帮助程序员打造个性化浏览器,以及为程序提供更简洁的交互功能,现在很多IE个性化工具就是利用BHO的来实现。 编辑本段 技术优势   “浏览器劫持”是一种不同于普通病毒木马感染途径的网络攻击手段,而是使用各种技术(如DLL插件等)插件对用户的浏览器进行篡改。安装后,它们会成为浏览器的一部分,可以直接控制浏览器进行指定的操作,根据需要,可以让你打开指定的网站,甚至是收集你系统中的各种私密信息。最可怕的是只有当浏览器已经被劫持了,你才会发现,反应过来,原来电脑已经出现了问题。比如IE主页被改,开机就会弹出广告等等。目前,浏览器劫持已经成为Internet用户最大的威胁之一。其实“浏览器劫持”就是通过BHO的技术手段进入你的系统的,而这种技术是合法的。   从某种观点看,Internet Explorer同普通的Win32程序没有什么两样。借助于BHO,你可以写一个进程内COM对象,这个对象在每次启动时都要加载。这样的对象会在与浏览器相同的上下文中运行,并能对可用的窗口和模块执行任何行动。例如,一个BHO能够探测到典型的事件,如GoBack、GoForward、DocumentComplete等;另外BHO能够存取浏览器的菜单与工具栏并能做出修改,还能够产生新窗口来显示当前网页的一些额外信息,还能够安装钩子以监控一些消息和动作。 编辑本段 注册表位置   BHO在注册表中的位置是:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects,有兴趣的朋友可以在这里做做实验。不过一定要记住你更改的每一步,否则会出错的哦!   BHO对象依托于浏览器主窗口。实际上,这意味着一旦一个浏览器窗口产生,一个新的BHO对象实例就要生成。任何 BHO对象与浏览器实例的生命周期是一致的。其次, BHO仅存在于Internet Explorer 4.0及以后版本中。   如果你在使用Microsoft Windows? 98, Windows 2000, Windows 95, or Windows NT版本4.0 操作系统的话,也就一块运行了活动桌面外壳4.71,BHO也被 Windows资源管理器所支持。 BHO是一个COM进程内服务,注册于注册表中某一键下。在启动时,Internet Explorer查询那个键并把该键下的所有对象预以加载。   迅雷中TDAtOnce_Now.dll和xunleiBHO_Now.dll为安全   如何发现BHO里面的危险模块.   首先有一个能够查看进程的软件 冰刃就不错 下面以它为例:   先打开冰刃—会看到一个BHO在这里就可以看到危险BHO进程了

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值