태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

'bho'에 해당되는 글 1건

  1. 2007/11/07 C#으로 익스플로러 툴바 및 BHO만들기 (13)
사실 익스플로러 툴바, BHO(Browser Helper Object)를 만드는게 여간 힘든일이 아닙니다. COM을 써야할 뿐더러 일반적인 프로그램이 아니기 때문에 정보 조차 잘 없죠.

하지만 C#으로 만들면 정말 쉽습니다.

우선 전 코드 프로젝트를 참고했습니다.

Band Objects - .NET 2.0 Redux
http://www.codeproject.com/csharp/BandObjects20.asp?select=1819328&df=100&forumid=306921&exp=0

 
위의 소스 파일은 코드 프로젝트의 소스를 사용하기 쉽게 약간 수정한 파일입니다. 기본 구조는 코드 프로젝트 소스와 마찬가지로 BandObject클래스를 상속받는 것입니다.

우선 다음 두 개의 레퍼런스를 추가하도록 합니다. COM의 MSHTML(Microsoft HTML Object Library)과 SHDocVw(Microsoft Internet Controls) 입니다. 두 레퍼런스를 추가하면 Object Browser에서 이들 어셈블리를 볼 수 있습니다.

다음 단계는 BandObject클래스를 상속받아 실제 툴바를 구현하는 단계입니다. 아래 코드는 사용자 참여 웹 툴바에서 사용된 예이며, 툴바와 BHO 구현에 필요한 핵심적인 코드만 적어 놓았습니다. Guid는 자신의 Guid를 적으세요. 

[Guid("719FAB8A-8E67-4ba6-915D-4EE1AD3A2CEE")]
[BandObject("사용자 참여 웹 툴바", BandObjectStyle.Horizontal | BandObjectStyle.ExplorerToolbar, HelpText = "사용자 참여 웹 툴바")]
public class UpwBandObject : BandObject
{
	public UpwBandObject()
	{
		InitializeComponent();

		minSize = new Size(100, 27); // 최소 크기를 반드시 적어줘야 합니다.

		SetSiteEvent += new SetSiteEventHandler(UpwBandObject_SetSiteEvent);
		ShowDWEvent += new ShowDWEventHandler(UpwBandObject_ShowDWEvent);
	}
	private void UpwBandObject_ShowDWEvent(bool fShow)
	{
		toolbarVisible = fShow;

		RefreshCurrentSite();
	}

	private void UpwBandObject_SetSiteEvent(object pUnkSite)
	{
		if (pUnkSite != null)
		{
			// add events
			webBrowserClass.BeforeNavigate2 += 
new DWebBrowserEvents2_BeforeNavigate2EventHandler(webBrowser_BeforeNavigate2);
			webBrowserClass.NavigateComplete2 += 
new DWebBrowserEvents2_NavigateComplete2EventHandler(webBrowser_NavigateComplete2);
			webBrowserClass.DocumentComplete += 
new DWebBrowserEvents2_DocumentCompleteEventHandler(webBrowser_DocumentComplete);
		}
		else
		{
			// remove events
			webBrowserClass.BeforeNavigate2 -= new DWebBrowserEvents2_BeforeNavigate2EventHandler(webBrowser_BeforeNavigate2);
			webBrowserClass.NavigateComplete2 -= new DWebBrowserEvents2_NavigateComplete2EventHandler(webBrowser_NavigateComplete2);
			webBrowserClass.DocumentComplete -= new DWebBrowserEvents2_DocumentCompleteEventHandler(webBrowser_DocumentComplete);
		}
	}

	private void webBrowser_BeforeNavigate2(object pDisp, ref object URL, ref object Flags, ref object TargetFrameName,
			  ref object PostData, ref object Headers, ref bool Cancel)
	{
	}

	private void webBrowser_NavigateComplete2(object pDisp, ref object URL)
	{
	}

	private void webBrowser_DocumentComplete(object pDisp, ref object URL)
	{
	}

	private void Navigate(string url)
	{
		object flags = null;
		object targetFrameName = null;
		object postData = null;
		object headers = null;

		webBrowserClass.Navigate(url, ref flags, ref targetFrameName, ref postData, ref headers);
	}
}

컴파일 전에 System.Windows.Forms, System.Drawing 레퍼런스를 추가하고 다음 using을 코드에 넣습니다.

using System.Windows.Forms;
using System.Runtime.InteropServices;
using SHDocVw;
using System.Reflection;
using System.Drawing;
using System.ComponentModel;
using Microsoft.Win32;
웹 브라우저 클래스의 이벤트들이 바로 BHO부분입니다. 이벤트에 관련된 부분은 Visual Studio의 Object Browser를 보면서 추가할 수 있습니다. 물론 MSDN에도 짧게나마 설명이 있습니다.

UserControl을 상속받으면 Visual Studio에서는 Designer로 폼을 편집할 수 있습니다. View Designer를 클릭해서 나오는 화면이 툴바에 나오게 될 화면입니다. 그 부분은 개발하고자 하는 툴바에 맞춰서 디자인 하시면 됩니다.

마지막 단계는 실제 툴바를 익스플로러에 등록하는 과정입니다. 우선 프로젝트 속성의 Assembly Information에서 Make assembly COM-Visible을 체크하고 컴파일을 합니다. 또 Strong name을 위해 Signing assembly (.snk)가 필요한데 이것 역시 프로젝트 속성에서 만들 수 있습니다.

그리고 빌드 후에 다음 명령을 실행 시킵니다. (Post build event에 등록 해놓으면 되겠죠.)

cd $(TargetDir)

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil" /if Interop.SHDocVw.dll
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil" /if $(TargetFileName)
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm" /unregister $(TargetFileName)
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm" /codebase $(TargetFileName)

익스플로러를 열면 툴바 영역에서 등록된 툴바가 메뉴에 표시됩니다.

디버깅은 프로퍼티의 Start Action에 externel program으로 익스플로러를 지정하면 됩니다.

혹시 궁금증 있으신 분은 코멘트를 남기시면 답변 드리겠습니다.