Languages/C#2010. 7. 21. 12:16

C# 에서는 FTP 에 관련된 기능들을 손쉽게 구현할 수 있도록 클래스들을 제공하고 있습니다.

그 중에서 FtpWebRequest가 많이 사용되어지고 있는데요.

FtpWebRequest Method 멤버 값 속성인 WebRequestMethods.Ftp 의 멤버 변수들을 보시면 각 기능들에 대해

알 수가 있습니다.

 

MSDN : http://msdn.microsoft.com/en-us/library/system.net.webrequestmethods.ftp_members.aspx

 

기본적인 사용 방법은 다음과 같습니다.

  FtpWebRequest reqFtp = (FtpWebRequest)WebRequest.Create("ftp 서버 주소");

 

  // 사용할 기능 설정

  reqFtp.Method = WebRequestMethods.Ftp.GetFileSize;

  reqFtp.Credentials = new NetworkCredential("UserName", "Password");

 

  // 요청에 대한 응답을 받습니다.

  FtpWebResponse resFtp = (FtpWebResponse)reqFtp.GetResponse();

  long fileSize = resFtp.ContentLength;

  resFtp.Close();

 

FtpWebResponse 에 대한 자세한 내용은 다음 주소를 참고하세요.

MSDN : http://msdn.microsoft.com/ko-kr/library/system.net.ftpwebresponse_members(VS.90).aspx

 

WebRequestMethods.Ftp 의 멤버 변수인 DownloadFile 을 사용하여 파일을 다운로드 할 수 있지만

현재 진행률을 보여주고 싶을 때 간단하게 이벤트 핸들러를 통해 그 값을 확인할 수가 있는데요.

 

WebClient 클래스를 사용하면 됩니다.

MSDN : http://msdn.microsoft.com/ko-kr/library/system.net.webclient_members(VS.90).aspx

 

간단한 사용법은 다음과 같습니다.

 using (WebClient request = new WebClient())

{

    request.Credentials = new NetworkCredential("UserName", "Password");

 

    // 파일 다운로드 진행률 변경 이벤트

    request.DownloadProgressChanged += request_DownloadProgressChanged;

 

    // 파일 다운로드 완료 이벤트

    request.DownloadFileCompleted += request_DownloadFileCompleted;

   

    // 다운로드 시작

    request.DownloadFileAsync("다운 받을 파일의 전체 경로");

}

 

간단하게 FTP 서버에서 파일을 다운 받는 예제를 만들어 보았습니다.

 

윈도우 7에서는 보안상의 문제로 C 드라이브에 엑세스 할 수 없어 저장이 안됩니다.

FTP_Download.zip

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

[ C# ] Struct To Byte, Byte To Struct  (0) 2012.08.17
[ C# ] Win32 API MouseEvent  (8) 2010.12.07
[ C# ] Default Sound Device 변경하기  (0) 2010.07.19
[ C# ] XML 쓰고 읽기  (0) 2010.05.21
[ C# ] Network 연결 확인  (0) 2010.05.21
Posted by 열ㅇl
Languages/C#2010. 7. 19. 17:51

최근에 프로그래밍을 하면서 기본 Sound Device를 상황에 맞게 선택한 Device로 설정해야 하는 상황이 발생하였습니다.

이리저리 알아보고 이것저것 시도를 해보았지만 구글신에게 버림받고 COM, Multimedia, System Programming등 에 대한

이해와 실력이 부족하기에 좌절을 맛봐야 했습니다. ㅠㅠ

이번 포스팅은 저와 같이 모자란 실력에 고민하는 분들에게 "모로 가도 서울만 가면 된다" 는 말이 있듯이

약간의 어이 없는 방법을 소개하고자 합니다. -_- ;;

 

기본적으로 다음 그림과 같이 제어판의 소리 메뉴를 선택하여 장치 목록 중에서 기본 장치로 설정하기 위해

해당 목록을 선택하여 마우스 오른쪽 버튼을 눌러 팝업창을 띄운 후 기본 장치로 설정을 클릭하게 되면

기본 사운드 장치로 설정이 되어집니다.

 

 

제가 생각해 낸 방법은

바로 이 과정을 프로그래밍으로 동작할 수 있게 구현한 것입니다. ;;

 

이를 구현하기 위해서 오랫만에 API 함수를 사용하게 되었습니다.

두 가지의 메뉴를 선택할 수 있게 하였는데요. 사용 여부 메뉴와 기본 장치로 설정입니다.

 

부끄럽지만 저 과정을 코드로 옮긴 소스는 다음과 같습니다.

public SoundDeviceChange()

{

    // 사운드 설정 창 실행 ( 바로가기 파일 실행 )

    Process.Start("Sound.lnk");

 

    // 창이 열리기 위한 잠시 대기 시간

    Thread.Sleep(500);

 

    SetHandle();

 

    // 현재 윈도우를 최상위로 설정

    BringWindowToTop(new WindowInteropHelper(Application.Current.MainWindow).Handle);

 

    int moveX = (int)SystemParameters.FullPrimaryScreenWidth;

    int moveY = (int)SystemParameters.FullPrimaryScreenHeight;

 

    // 사운드 설정창의 위치를 오른쪽 하단으로 이동

    MoveWindow(soundHandle, moveX, moveY, 0, 0, false);

}

 

// 핸들 얻어오기

private void SetHandle()

{

    // 바탕화면 핸들

    deskTopHandle = GetDesktopWindow();

 

    // 사운드 설정 창 핸들

    soundHandle = FindWindow(null, "소리");

 

    // 사운드 설정 창의 재생 탭 핸들

    playHandle = GetWindow(soundHandle, GW_CHILD);

 

    // 사운드 설정 창의 라벨 핸들 ( 설정을 수정할 재생 장치 선택: )

    lableHandle = GetWindow(playHandle, GW_CHILD);

 

    // 사운드 설정 창의 목록(ListView) 핸들

    listViewHandle = GetWindow(lableHandle, GW_HWNDNEXT);

 

    // 사운드 설정 창이 늦게 뜰 경우를 대비

    if (listViewHandle == IntPtr.Zero)

    {

        SetHandle();

    }

}

 

// 해당 목록에서 마우스 오른 쪽 버튼 클릭 동작하는 함수

private void ShowPopupWindow(int soundDeviceIndex)

{

    // 선택 목록 인덱스가 이전 인덱스보다 위라면

    if (previousSoundDeviceIndex > soundDeviceIndex)

    {

        // 해당 인덱스 만큼 위로 이동

        for (int j = 0; j <= previousSoundDeviceIndex; j++)

        {

            PostMessage(listViewHandle, WM_KEYDOWN, VK_UP, 0);

        }

    }

    // 선택 목록 인덱스가 이전 인덱스보다 아래라면

    else

    {

        // 해당 인덱스 만큼 아래로 이동

        for (int j = 0; j <= soundDeviceIndex; j++)

        {

            PostMessage(listViewHandle, WM_KEYDOWN, VK_DOWN, 0);

        }

    }

 

    // 현재 지점에서 마우스 오른쪽 이벤트 발생

    PostMessage(listViewHandle, WM_RBUTTONUP, 0, 0);

 

    // 목록에 대한 설정 팝업 창 핸들 찾기

    while (true)

    {

        // 바탕화면 핸들의 첫번 째 자식( 팝업창은 첫 번째 자식 윈도우로 등록 됨 )

        popupHandle = GetWindow(deskTopHandle, GW_CHILD);

 

        // 윈도우의 클래스 이름 얻어오기

        GetClassName(popupHandle, className, 256);

 

        // 팝업창의 클래스 이름은 #32768

        if (className.ToString() == "#32768")

        {

            // 팝업창의 스타일을 WS_DISABLED로 설정하여 사라지게 만듬.

            SetWindowLong(popupHandle, GWL_STYLE, WS_DISABLED);

            break;

        }

    }

}

 

// 현재 인덱스의 디바이스를 기본 장치로 설정

public void ChangeDevice(int soundDeviceIndex)

{

    // 이전 디바이스 인덱스와 같으면 리턴

    if (previousSoundDeviceIndex == soundDeviceIndex)

    {

        return;

    }

 

    // 현재 목록에 대한 설정 팝업 창 실행

    ShowPopupWindow(soundDeviceIndex);

 

    // 기본 장치로 설정 메뉴 단축키는 D

    PostMessage(popupHandle, WM_KEYDOWN, VK_D, 0);

 

    // 이전 디바이스 인덱스 갱신

    previousSoundDeviceIndex = soundDeviceIndex;

}

 

// 현재 인덱스의 디바이스의 사용 여부를 변경

public void ChangeDevice(int soundDeviceIndex, bool disable)

{

    // 현재 목록에 대한 설정 팝업 창 실행

    ShowPopupWindow(soundDeviceIndex);

 

    // 사용은 2 칸 아래

    int keyDown = 2;

 

    // 사용 안함은 3칸 아래

    if (disable)

    {

        keyDown = 3;

    }

 

    // 해당 메뉴 만큼 아래로 이동

    for (int k = 0; k < keyDown; k++)

    {

        PostMessage(popupHandle, WM_KEYDOWN, VK_DOWN, 0);

    }

 

    // Enter 이벤트 발생

    PostMessage(popupHandle, WM_KEYDOWN, VK_RETURN, 0);

 

    // 이전 디바이스 인덱스 갱신

    previousSoundDeviceIndex = soundDeviceIndex;

}

 

실행화면과 같이 목록의 디바이스 중에서 선택한 선택한 디바이스를 선택하고

SoundChange 버튼을 누르게 되면 기본장치로 설정이 되어집니다.

Sound On 버튼을 누르면 사용 상태로 변경하게 되고 Sound Off 버튼을 누르면 사용 안함 상태로 변경되어 집니다.

 

제대로 된 방법이 아니기 때문에 몇 가지 제약사항이 있습니다.

 

1. 윈도우 7을 바탕으로 만들었기 때문에 다른 버전에서도 위와 같은 절차인지 모르겠습니다.

 

2. 팝업창을 DISABLE 시키긴 하지만 잠깐의 깜빡일 정도로 보일 수가 있습니다.

    컴퓨터 사양에 틀린 것 같습니다. 보이는 컴퓨터와 안 보이는 컴퓨터가 있더군요.

 

3. 스피커와 오디오의 팝업창 메뉴가 다르기 때문에 오디오를 선택 후 사용과 사용안함의 기능을

    사용하면 제대로 동작하지 않습니다. 오디오 목록들은 사운드 설정 창에서 사용안함으로 변경 후

    마우스 오른쪽 버튼을 눌러 사용 할 수 없는 장치 표시메뉴를 UnCheck 하시는게 좋습니다.

 

전체 코드는 첨부파일을 받으시면 됩니다.

 

혹시 진짜로 코드로 디바이스를 제어하는 법을 아시는 분께선 꼭 알려주시길 바랍니다. ㅠㅠ

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

[ C# ] Win32 API MouseEvent  (8) 2010.12.07
[ C# ] C# FTP Download  (3) 2010.07.21
[ C# ] XML 쓰고 읽기  (0) 2010.05.21
[ C# ] Network 연결 확인  (0) 2010.05.21
소수점 자릿수 출력하기  (0) 2009.04.11
Posted by 열ㅇl
Languages/C#2010. 5. 21. 13:27

XML 파일을 문자열로 생성하고 읽어 들이는 방법입니다.

 

        /// <summary>

        /// XML 생성

        /// </summary>

        private void CreateXML()

        {

            // 생성할 XML 파일 경로와 이름, 인코딩 방식을 설정합니다.

            XmlTextWriter textWriter = new XmlTextWriter(@"C:\example.xml", Encoding.UTF8);

 

            // 들여쓰기 설정

            textWriter.Formatting = Formatting.Indented;

 

            // 문서에 쓰기를 시작합니다.

            textWriter.WriteStartDocument();

 

            // 루트 설정

            textWriter.WriteStartElement("root");

 

            // 노드와 값 설정

            textWriter.WriteStartElement("root_a");

            textWriter.WriteString("a");

            textWriter.WriteEndElement();

 

            // 노드 안에 하위 노드 설정

            textWriter.WriteStartElement("root_b");

 

            textWriter.WriteStartElement("b");

            textWriter.WriteString("b");

            textWriter.WriteEndElement();

 

            textWriter.WriteStartElement("bb");

            textWriter.WriteString("bb");

            textWriter.WriteEndElement();

 

            textWriter.WriteEndElement();

 

            textWriter.WriteStartElement("root_c");

            textWriter.WriteString("1");

            textWriter.WriteEndElement();

 

            textWriter.WriteEndElement();

 

            textWriter.WriteEndDocument();

            textWriter.Close();

        }

 

        /// <summary>

        /// XML 파일 읽기

        /// </summary>

        private void ReadXML()

        {

            try

            {

                XmlDocument xmldoc = new XmlDocument();

                xmldoc.Load(@"C:\example.xml");

                XmlElement root = xmldoc.DocumentElement;

 

                // 노드 요소들

                XmlNodeList nodes = root.ChildNodes;

 

                // 노드 요소의 값을 읽어 옵니다.

                foreach (XmlNode node in nodes)

                {

                    switch (node.Name)

                    {

                        case "root_a":

                            string a = node.InnerText;

                            break;

 

                        case "root_b":

                            string b = node["b"].InnerText;

                            string bb = node["bb"].InnerText;

                            break;

 

                        case "root_c":

                            int c = int.Parse(node.InnerText);

                            break;

                    }

                }

            }

            catch (IOException ex)

            {

                Console.WriteLine(ex.ToString());

            }

        }

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

[ C# ] C# FTP Download  (3) 2010.07.21
[ C# ] Default Sound Device 변경하기  (0) 2010.07.19
[ C# ] Network 연결 확인  (0) 2010.05.21
소수점 자릿수 출력하기  (0) 2009.04.11
c#으로 툴바 만들기  (2) 2009.03.30
Posted by 열ㅇl
Languages/C#2010. 5. 21. 12:00

현재 네트워크가 연결 되었는지를 확인하는 메소드입니다.

 

  using System.Net.NetworkInformation;

 

  // 네트워크 연결

  if (NetworkInterface.GetIsNetworkAvailable())

  {

      // to do

  }

  else

  {

      // to do

  }

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

[ C# ] C# FTP Download  (3) 2010.07.21
[ C# ] Default Sound Device 변경하기  (0) 2010.07.19
[ C# ] XML 쓰고 읽기  (0) 2010.05.21
소수점 자릿수 출력하기  (0) 2009.04.11
c#으로 툴바 만들기  (2) 2009.03.30
Posted by 열ㅇl
Languages/C, C++2010. 2. 8. 21:40

고급반 초기에 시스템 프로그래밍 시간에

소켓통신에 대해 학습했던 내용들입니다.

 

- AsyncSelect

 

 

 

- EventSelect

 

 

 

- Overlapped

 

 

 

- IOCP

 

 

 

- AsyncSelect 발표 PPT

 

 

Posted by 열ㅇl
Languages/C, C++2009. 10. 19. 00:12

◆ 사람들이 보통 사용하는 식은 중위 표기식으로 다음과 같습니다.

(150+60/2)*2+(78-20+60)+1

 

후위 표기식은 다음과 같은 형태로 스택을 작성하여 구현 할 수 있습니다.

150 60 2 / + 2 * 78 20 - 60 + + 1 +

 

고려사항:

- 괄호 안 연산 우선

- 연산자 우선 순위

- 숫자 자리 수

- 예외 사항 발생 시 리턴

 

절차:

1. 예외 사항 발생 시 예외 메시지 출력 후 리턴 ( 괄호 불 일치, 연산자 에러, 피연산자 에러 )

2. ' ( ' , ' { ' , ' [ ' 이면 PUSH

3. ' ) ' , ' } ' , ' ] ' 이면 ' ( ' , ' { ' , ' [ ' 가 아닐 동안 POP하여 문자 배열에 저장

4. ' + ', ' - ' 일 경우 POP 하여 연산기호 일 경우 문자 배열에 저장, 아닐 경우 다시 PUSH

   현재 연산기호 PUSH

5. ' * ', ' / ' 일 경우 POP 하여 연산 우선 순위가 같은 경우 문자 배열에 저장, 아닐 경우 다시 PUSH

   현재 연산기호 PUSH  

6. 숫자 일 경우 문자 배열에 저장.

   숫자 단위를 구분하기 위해 다음 문자(연산기호, 괄호)를 보고 ' ' 문자 삽입

7. 스택에 남아 있는 문자 POP

8. 문자 배열에 마지막에 '\0' 문자 삽입

 

[ 실행 화면 ]

 

[ 소스 코드]

  200 // 중위 표기를 후위 표기로 변환

  201 char* infix_to_postfix(char* exp)

  202 {

  203     int i=0, p=0;

  204     int length = strlen(exp);

  205     char symbol;

  206     char* postfix = (char*)malloc(length * 2);

  207 

  208     for(i=0; i<length; i++)

  209     {

  210         symbol = exp[i];

  211 

  212         switch(symbol)

  213         {       

  214         case '(' :

  215         case '{' :

  216         case '[' :

  217             push(symbol); // 열림 괄호를 스택에 저장

  218             break;

  219 

  220         case ')':

  221         case '}':

  222         case ']':

  223             postfix_case_bloack(postfix, &p);

  224             break;

  225 

  226         case '+' :           

  227         case '-' :   

  228             postfix_case_operator_1(postfix, symbol, &p);

  229             break;

  230 

  231         case '*' :           

  232         case '/' :               

  233             postfix_case_operator_2(postfix, symbol, &p);

  234             break;

  235 

  236         default:

  237             postfix_case_default(postfix, symbol, exp, &p, i);

  238             break;

  239         }

  240     }

 

 

  136 void postfix_case_operator_1(char* postfix, char symbol, int *p)

  137 {

  138     char temp;

  139 

  140     while(1)

  141     {

  142         if(top == NULL)

  143         {

  144             break;

  145         }

  146         temp = (char)pop(); // 스택에서 하나를 꺼냄

  147 

  148         if(temp == '+' || temp == '-' || temp == '*' || temp == '/') // 연산 기호라면

  149         {

  150             postfix[(*p)++] = temp; // 문자 배열에 저장\tab

  151             postfix[(*p)++] = ' ';

  152         }

  153         else

  154         {

  155             push(temp); // 연산 기호가 아니면 다시 스택에 저장

  156             break;

  157         }

  158     }

  159     push(symbol); // 현재 연산 기호 저장

  160 }

 

 

  162 void postfix_case_operator_2(char* postfix, char symbol, int *p)

  163 {

  164     char temp;

  165 

  166     while(1)

  167     {

  168         if(top == NULL)

  169         {

  170             break;

  171         }

  172         temp = (char)pop(); // 스택에서 하나를 꺼냄

  173 

  174         if(temp == '*' || temp == '/') // 우선순위가 같은 연산 기호라면

  175         {

  176             postfix[(*p)++] = temp; // 문자 배열에 저장\tab   

  177             postfix[(*p)++] = ' ';

  178         }

  179         else

  180         {

  181             push(temp); // 연산 기호가 아니면 다시 스택에 저장

  182             break;

  183         }

  184     }

  185     push(symbol); // 현재 연산 기호 저장

  186 }

 

 

  188 void postfix_case_default(char* postfix, char symbol, char* exp, int *p, int i)

  189 {

  190     postfix[(*p)++] = symbol; // 숫자를 문자 배열에 저장

  191 

  192     // 숫자 구분을 위해

  193     if(exp[i+1] == '+' || exp[i+1] == '-' || exp[i+1] == '*' || exp[i+1] == '/' ||

  194         exp[i+1] == ')' || exp[i+1] == '}' || exp[i+1] == ']' || exp[i+1] == '\0')

  195     {

  196         postfix[(*p)++] = ' '; // 공란 삽입

  197     }

  198 }

 

 

    73 // 후위 표기 연산

   74 element evalPostfix(char *exp)

   75 {

   76     double opr1, opr2;

   77     int value, i=0, count=0;

   78     int length = strlen(exp);

   79     char symbol;

   80 

   81     for(i=0; i<length; i++)

   82     {

   83         symbol = exp[i];

   84 

   85         if(symbol >= '0' && symbol <= '9')

   86         {

   87             while(exp[i + count] != ' ') // 숫자 구분을 위해 검사

   88             {

   89                 count++;

   90             }

   91             value = atoi(&exp[i]);

   92             i+=count;

   93             count=0;

   94             push(value);

   95         }

   96         else

   97         {

   98             if(symbol != ' ') // 숫자 구분을 위한 ' ' 이 아닌 경우에만

   99             {

  100                 opr2 = pop();

  101                 opr1 = pop();

  102 

  103                 switch(symbol)

  104                 {

  105                 case '+' : push(opr1 + opr2); break;

  106                 case '-' : push(opr1 - opr2); break;

  107                 case '*' : push(opr1 * opr2); break;

  108                 case '/' : push(opr1 / opr2); break;

  109             }

  110             }

  111         }

  112     }

  113     return pop();

  114 }

 

▶ 전체 소스 코드는 첨부 파일을 다운 받으시면 됩니다.

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

Import C# dll  (2) 2012.08.17
[ 고급반 ] C++ 소켓 통신  (0) 2010.02.08
단기반 실습 - C++  (0) 2009.03.05
단기반 - OOP 프로젝트_C++  (0) 2009.03.05
단기반 - 관리프로그램 프로젝트_C언어  (0) 2009.03.05
Posted by 열ㅇl
Languages/C#2009. 4. 11. 21:00

String..::.Format 메서드 (String, Object)

- 지정된 string 의 형식 항목을 지정된 object 인스턴스의 값에 해당하는 텍스트로 바꿉니다.

 

< 매개 변수 >

format
형식: system..::.string
합성 형식 문자열 입니다.

arg0

형식: syste..::.object
형식을 지정할 object 입니다.

< 반환 값 >

 

형식: system..::.string
첫째 형식 항목이 arg0에 해당하는 string으로 바뀐 format의 복사본을 반환합니다.

 

ex) string.Format("{0,0:F6}", string 변수[0]);

 

MSDN: http://msdn.microsoft.com/ko-kr/library/fht0f5be.aspx

'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
c#으로 툴바 만들기  (2) 2009.03.30
Posted by 열ㅇl
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
Languages/C, C++2009. 3. 5. 21:20

탕정마을

스케쥴러

 

연결리스트_더미 유

정렬

 

기수정렬

 

Posted by 열ㅇl
Languages/C, C++2009. 3. 5. 20:56

전공별 학생관리

쩔다의 전설_게임

 

100분토론

 

Posted by 열ㅇl