Languages/C#2009. 3. 30. 17:08

원본 출처: http://ljh131.tistory.com/68

 

사실 익스플로러 툴바, 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를 적으세요.

 

     1 [Guid("719FAB8A-8E67-4ba6-915D-4EE1AD3A2CEE")]  

    2 [BandObject("사용자 참여 웹 툴바", BandObjectStyle.Horizontal |

    3     BandObjectStyle.ExplorerToolbar, HelpText = "사용자 참여 웹 툴바")]  

    4 public class UpwBandObject : BandObject  

    5 {  

    6     public UpwBandObject()  

    7     {  

    8         InitializeComponent();  

    9 

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

   11 

   12         SetSiteEvent += new SetSiteEventHandler(UpwBandObject_SetSiteEvent);  

   13         ShowDWEvent += new ShowDWEventHandler(UpwBandObject_ShowDWEvent);  

   14     }  

   15     private void UpwBandObject_ShowDWEvent(bool fShow)  

   16     {  

   17         toolbarVisible = fShow;  

   18 

   19         RefreshCurrentSite();  

   20     }  

   21 

   22     private void UpwBandObject_SetSiteEvent(object pUnkSite)  

   23     {  

   24         if (pUnkSite != null)  

   25         {  

   26             // add events  

   27             webBrowserClass.BeforeNavigate2 +=

   28                 new DWebBrowserEvents2_BeforeNavigate2EventHandler(webBrowser_BeforeNavigate2);  

   29             webBrowserClass.NavigateComplete2 +=

   30                 new DWebBrowserEvents2_NavigateComplete2EventHandler(webBrowser_NavigateComplete2);  

   31             webBrowserClass.DocumentComplete +=

   32                 new DWebBrowserEvents2_DocumentCompleteEventHandler(webBrowser_DocumentComplete);  

   33         }  

   34         else 

   35         {  

   36             // remove events  

   37             webBrowserClass.BeforeNavigate2 -=

   38                 new DWebBrowserEvents2_BeforeNavigate2EventHandler(webBrowser_BeforeNavigate2);  

   39             webBrowserClass.NavigateComplete2 -=

   40                 new DWebBrowserEvents2_NavigateComplete2EventHandler(webBrowser_NavigateComplete2);  

   41             webBrowserClass.DocumentComplete -=

   42                 new DWebBrowserEvents2_DocumentCompleteEventHandler(webBrowser_DocumentComplete);  

   43         }  

   44     }  

   45 

   46     private void webBrowser_BeforeNavigate2

   47         (object pDisp, ref object URL, ref object Flags, ref object TargetFrameName,  

   48               ref object PostData, ref object Headers, ref bool Cancel)  

   49     {  

   50     }  

   51 

   52     private void webBrowser_NavigateComplete2(object pDisp, ref object URL)  

   53     {  

   54     }  

   55 

   56     private void webBrowser_DocumentComplete(object pDisp, ref object URL)  

   57     {  

   58     }  

   59 

   60     private void Navigate(string url)  

   61     {  

   62         object flags = null;  

   63         object targetFrameName = null;  

   64         object postData = null;  

   65         object headers = null;  

   66 

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

   68     }  

   69 } 

 
컴파일 전에 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으로 익스플로러를 지정하면 됩니다.

'Languages > C#' 카테고리의 다른 글

[ C# ] C# FTP Download  (3) 2010.07.21
[ C# ] Default Sound Device 변경하기  (0) 2010.07.19
[ C# ] XML 쓰고 읽기  (0) 2010.05.21
[ C# ] Network 연결 확인  (0) 2010.05.21
소수점 자릿수 출력하기  (0) 2009.04.11
Posted by 열ㅇl