Posted by 나비:D
:


  강좌 최초 작성일 : 2003년 06월 15일
  강좌 최종 수정일 : 2004년 03월 17일

  작성자 : HOONS(박경훈) http://www.hoonsbara.com

  강좌 제목 :  응용프로그램 조이기1  
 


1. 이강좌는?

음;; 응용 프로그램 조이기란 무엇인가??-_-;;
한마디로 메크로 프로그램이라고 할수 있다.
그렇다면 메크로 프로그램이란 란 무엇이냐??
사람의 동작이 아닌 자동으로 어떠한 프로그램 제어한다는 것이다. 예를들어서
만약 슬롯 머신 프로그램이 있다면 사람 없이.. 자동으로
그 프로그램이 실행되고 자기가 알아서 게임을 한다는 것이다.
이런 프로그램은 실생활에서 많이 쓰이는 부분이고 앞으로도 쓸일이 많이 있을것이다.
음;; 예를들어서 자동 메신저 로그인 프로그램이라던지 (자기 멋대로 실행되서 로그인하고-_-),
등등 어떤 응용프로그램도 메크로프로그램으로 제어를 할수 있게된다.
닷넷으로 이쪽 프로그램을 만들기 시작한것이 어떠한 게임 중독자의 의뢰로 부터 시작했었다.
의뢰의 내용은 대충 N회사의 포커 게임을 5개의 컴퓨터가 메세지를 주고 받으며
컴퓨터가 자동으로 게임을 진행하면서 돈을 몰아 주는 프로그램을 만들어 달라는 것이였다.
쩝;; 그때 무자게 머리 아프게 작업했던 기억이-_-;;
음; 이제는 그 메크로 프로그램의 가장 기본적인 사항들을 강좌로나마 남겨보고자한다.

시작하기전에 알아둬야 할 몇가지를 기초 지식을 설명하려고 한다.
먼저 핸들값의 관한 지식이다.



2.윈도우에서 핸들값이란 무엇인가??

응용프로그램을 제어하려면 바로 핸들 이라는 배경지식을 필수로 알고 있어야한다.
자..그럼 핸들에 관한 지식을 예를 들어 설명해 보도록 하겠다.
자기 컴퓨터의 윈도우가 실행되고 msn메신저와
익스플로러등등의 프로그램이 응용 프로그램이 실행되어 있다고 가정하자
그렇다면 전체 핸들의 구조는 먼저 부팅했던 된 윈도우에 핸들 구조를 보면
[메신저,익스플로러,등등]의 핸들들을 자식으로 가지게 된다(트리구조와 유사하다.)

윈도우-익스플로러
         -메신저-로그인버튼
                    -친구추가 버튼
                    -로아웃버튼
         -메모장

깊이 들어 가서 메신저의 구조를 본다면..
메신저 안의 [로그인버튼,친구추가버튼,리스트뷰,리스트박스] 이런 컨트롤들이 각각의
핸들값들을 가지고 있는것이다
즉 이러한 버튼 하나하나의 것들도 다 핸들값을 가지고 있다는 개념이고,
핸들의 구조역시 트리구조로 되어져 있다는 것을 예측하실수 있을 것이다.

<그림> 나중에 설명할 SPY++에 나와있는 핸들의 구조를 캡쳐한것이다


3. 핸들값을 왜 알아야 하는것인가.. ??

만약 메신저에 있는 친구추가 버튼을 자동으로 누르게 하고싶다면
"버튼을 클릭했다"와 같은 이벤트를 바로 핸들값을 찾아서 주어야 하기 때문이다.
이핸들값에 클릭 메세지를 보내라 라는 프로그램 명령을 하게 되기 때문이다.
우리가 어떤 메크로 프로그램을 하기 위해서는 핸들값을 몰라서는 프로그램을 만들수 없다.
앞으로 다룰 내용이 핸들값을 가져오는 부분이 될 것이고 그후에 메세지를 보내고,,
등등!!의 프로그램을 만들어 보게 될것이다.

그럼 오늘은 여기까지^^





  강좌 최초 작성일 : 2003년 06월 19일
  강좌 최종 수정일 : 2004년 03월 17일

  작성자 : HOONS(박경훈) http://www.hoonsbara.com

  강좌 제목 :  응용프로그램 조이기2 (핸들값찾기)  
 


1. API함수를 이용한 핸들찾기

핸들을 찾기위해 알아야 할 기초적 API함수들을 알아 보도록 하겠다.

1_1.FindWindow()

가장 최상위의 핸들을 찾는 함수이며 인자값으로 클래스이름과 캡션값을 넘겨준다.

C#에서의 선언하기

[DllImport("user32.dll")]
public  static extern int  FindWindow(string  lpClassName,string  lpWindowName);

첫번째 인자값은 찾고자하는 클래스이름,두번째는 캡션값을 넘겨준다.
둘중 하나의 값만 주어도 찾을수 있지만 캡션명이 똑같은 프로그램이 실행중이라면,
클래스명이 필요할것이다.리턴값은 그 캡션명과 클래스 이름을 가지고 있는 핸들값이다.
이런 캡션명과 클래스명은 spy++프로그램을 통해서 알수 있다.
하지만 이함수는 단지 한프로그램의 최상위 핸들 값만 리턴해줄 뿐이고,
자식들의 핸들값들은 FindWindowEX()라는 함수를 통해 알 수가 있다.

참고자료:ms-help://MS.VSCC/MS.MSDNVS.1042/winui/windows_03sn.htm

1_2.FindWindowEX()

인자값으로 받은 핸들의 자식 핸들을 찾는 클래스이다.

[C#에서의 선언]

[DllImport("user32.dll")]
public  static extern int  FindWindowEx(int  hWnd1,int  hWnd2,string  lpsz1,string  lpsz2);

첫번째 인자값은 바로 위의 부모값을 주고, 두번째 인자값은 0이나 null을 주자.
세번째와 네번째 인자값에는 FindWindow와 마찬가지로 클래스명과 캡션명을 넘겨주면
첫번째 인자로 넘겨주었던 핸들자식중에 세번째 네번째 주었던 인자값의 해당하는 핸들을 찾는것이다.
만약 핸들을 찾으면 핸들값을 리턴해주고 그렇지 않으면 0을 리턴한다.

참고자료:ms-help://MS.VSCC/MS.MSDNVS.1042/winui/windows_1zjs.htm



2. SPY++따라하기

이 두개의 함수만으로도 일단 왠만한 핸들은 다 접근할수 있을거라 생각한다.
그렇다면 이제 SPY++을 통해 캡션명과 클래스이름을 알아 보는 방법을 보자.



[그림1]SPY++의 실행

 

[그림2] 기본 메뉴의 설명

 



[그림3] SPY++캡션명과 클래스명

 

[그림4] SPY++의 핸들 속성

 

 

이 SPY++을 주물럭 주물럭 하다보면 쉽게 익숙해 질것이다.
그렇다면 이제 한번 예제를 통해서 핸들값을 가져오는 연습을 한번 해보자
아래의 예제는 위에 [그림4] 에 나오는 필자의 msn메신저5.0버전을
FindWindow와 FindWindowEX를 통해서 한번 접근해 본것이다.

3. 핸들값 찾기 예제(ConSole Program)

using System;
using System.Runtime.InteropServices; //추가.. namespace _1_1Con
{
    class Class1
    {
        //API함수를 선언한다.
        [DllImport("user32.dll")]
        public  static extern int  FindWindow(string  lpClassName,string  lpWindowName);
        [DllImport("user32.dll")]
        public  static extern int  FindWindowEx(int  hWnd1,int  hWnd2,string  lpsz1,string  lpsz2);

        [STAThread]
        static void Main(string[] args)
        {
            Console.WriteLine("메신저의 핸들값은?");
            Console.WriteLine("캡션값만 입력한 핸들값 : "+FindWindow(null,"MSN Messenger").ToString());
            Console.WriteLine("클래스명만 입력한 핸들값 :"+FindWindow("MSNMSBLClass",null).ToString());
            //클래스명과 핸들값둘중 하나만 입력해도 값은 똑같이 리턴이 된다.
            //그렇다면 이제 부모핸들값을들 저장시키면서 한번 그림 4에 있는 대화상대 추가 핸들값을 알아내보자.             int hw1=FindWindow(null,"MSN Messenger");
            Console.WriteLine("핸들값1:"+hw1.ToString());
            int hw2=FindWindowEx(hw1,0,"PluginHostClass",null);
            Console.WriteLine("핸들값2:"+hw2.ToString());
            int hw3=FindWindowEx(hw2,0,"MSNMSBLGeneric",null);
            Console.WriteLine("핸들값3:"+hw3.ToString());
            //여기까지 눈으로 내려온것이 확인이 되었다면 밑에 클래스 명들을 살펴보자.
            //그러면 분면 클래스 이름 두개가 같은것이 확인이 될것이다.그러기에 반드시 여기에는 캡션명을 같이 해주어야한다.

            int hw4=FindWindowEx(hw3,0,"MSNMSBLGeneric","Task List");
            Console.WriteLine("핸들값4:"+hw4.ToString());
            int hw5=FindWindowEx(hw4,0,"Button","전화 걸기");
            Console.WriteLine("핸들값5:"+hw5.ToString());
            //여기까지 출력이 되었다면 버튼 핸들값까지 알아내는것이 성공!!         }
    }
}


[결과]
 

핸들값을 가져오는것이 성고했다면..다음과같은 숫자들이 출력될것이고,
실패하였을 경우 전부0을 리턴하게 될 것이다.
오늘은 핸들값을 가져오는 연습을 해봤고 이제
다음 강좌에서는 핸들에 이벤트를 발생시켜보도록 하겠다.

 





  강좌 최초 작성일 : 2003년 06월 22일
  강좌 최종 수정일 : 2004년 03월 17일

  작성자 : HOONS(박경훈) http://www.hoonsbara.com

  강좌 제목 :  응용프로그램 조이기3 (MSN 5.0 제어하기)
 


1. 이벤트 메세지 보내보기

이전 강좌에서 메신저의 핸들을 찾아내 봤을것이다.
만약 성공적으로 구하고자 하는 핸들값을 찾아 내 봤다면
이제 한번 그 버튼을 클릭하는 이벤트를 보내기 위해서는 이벤트를
보내는 API함수를 알아야할 것이다. 먼저 이벤트를 보내는 API함수
중에 SendMessage()대해 알아보도록 하겠다.

1.2 SendMessage() 이벤트 전달함수

C#에서의 함수 선언은 다음과 같이 한다.

[DllImport("user32.dll")]
public  static extern int  SendMessage(int hwnd,int wMsg,int wParam,int lParam);

첫번째 인자값은 이벤트를 보낼 핸들 값을 넣어주고, 두번째 인자값은 이벤트 메세지에 해당된다.
세번째와 네번째 인자값은 그에 따른 부수저인 메세지를 전달되는 것이다.
메세지에 대한 정의는 파일로 첨부 하였으니 상황에 따라 참고해서 쓰면 될 것이다.
이벤트 상황에 따라 SendMessage()함수가 다르게 쓰이므로 많은 연습이 필요할 것이다.


2. MSN메신저5.0 제어 해보기


먼저 바로 전 강좌에서 핸들값을 가져오는것이 성공하였다면 바로 이벤트 예제를 해보도록 하자.

2.1 핸들값의 구조파악

[그림1]예제핸들

 

그림1에 보이는 핸들 구조는 필자의 메신저의 즐겨쓰는버튼버튼까지의 핸들 구조를 열어 본것이다.
FindWindow함수와 FindwWindowEX로 버튼의 핸들값을 알아낸 후 클릭 이벤트를 줄것이다.

2.2 제어하기 예제 코드

using System;
using System.Runtime.InteropServices; //추가..

namespace _1_1Con
{
    class Class1
    {
        //API함수를 선언한다.        

        [DllImport("user32.dll")]
        public  static extern int  FindWindow(string  lpClassName,string lpWindowName);

        [DllImport("user32.dll")]
        public  static extern int  FindWindowEx(int  hWnd1,int  hWnd2,string  lpsz1,string  lpsz2);

        [DllImport("user32.dll")]
        public  static extern int  SendMessage(int  hwnd,int  wMsg,int  wParam,int  lParam);

        [STAThread]
        static void Main(string[] args)
        {
            //핸들값을 찾아보자
            int hw1=FindWindow(null,"MSN Messenger");
            Console.WriteLine("핸들값1:"+hw1.ToString());

            int hw2=FindWindowEx(hw1,0,"PluginHostClass",null);
            Console.WriteLine("핸들값2:"+hw2.ToString());

            int hw3=FindWindowEx(hw2,0,"MSNMSBLGeneric",null);
            Console.WriteLine("핸들값3:"+hw3.ToString());

            int hw4=FindWindowEx(hw3,0,"MSNMSBLGeneric","Task List");
            Console.WriteLine("핸들값4:"+hw4.ToString());

            int hw5=FindWindowEx(hw4,0,"Button","즐겨쓰는 메뉴");
            Console.WriteLine("핸들값5:"+hw5.ToString());

            //여기까지 출력이 되었다면 버튼 핸들값까지 알아내는것이 성공!!

            const int WM_LBUTTONDOWN = 0x0201;
            const int WM_LBUTTONUP = 0x0202;
            const int BM_CLICK = 0x00F5;

            //마우스 클릭이벤트이다
            SendMessage(hw5,BM_CLICK,0,1);

            //마우스 다운+업=클릭 이므로 이렇게 사용해도 무방하다
            SendMessage(hw5,WM_LBUTTONDOWN,0,1);
            SendMessage(hw5,WM_LBUTTONUP,0,1);        
        }
    }
}

[그림2] 실행 예제

 

실행 하면 두번 클릭 이벤트를 보냈으니 잽싸게 메뉴창이 오르락 내리락한 모습을 봤을거라 생각한다.
우선은 간단한 버튼 클릭 이벤트를 보내 보았다. 앞의 강의에 더 많은 이벤트를 보내 보도록 하면서..
오늘 강의는 여기서 마치도록 하겠다.

내일 강의는 핸들에 관련된 API함수들을 자세히 알아보도록 하겠다.그럼..




  강좌 최초 작성일 : 2003년 06월 22일
  강좌 최종 수정일 : 2004년 03월 17일

  작성자 : HOONS(박경훈) http://www.hoonsbara.com

  강좌 제목 :  응용프로그램 조이기4 (핸들값찾기2)
 


1. 찾기 힘든 핸들값?!

앞의 강좌에 삘(Feel)을 받아 이것저것 많은 이벤트 보내기 실습을 해본 사람이라면..
여러 응용프로그램의 핸들을 찾던 도중 안풀리는 몬가의 문제거리를 발견 했을거라 생각한다.
물론 이강좌를 이해하려면 앞의 예제를 다른 프로그램에 많이 응용을 해봐야 한다.
그리고 어떤 문제거리를 받아 보아야만 이 강좌가 엄청의 감동의 물결을 가져다 줄것이다.
그렇다면 몬가 안풀리는 문제거리를 그림을 통해서 살펴보도록 하자.

그림1(몬가 이상한 핸들구조)

위에서 본 그림을 살펴보면..
한 응용프로그램의 핸들아래 세개의 핸들이 있는 구조이다..(색칠한 부분)
그리고 자기가 이벤트를 보내고자하는 부분은 그 핸들들의 첫번째핸들에 속해있는 버튼인 것이다.
근데 세개의 핸들이 클래스명 자리에 #32770 이라는 클래스명이 들어가있다.
이것은 MFC에서 개발을 할때 클래스 명을 숨겨버렸기에 #32770이라는 결과가 나오는 것이다.
캡션값도 없고..클래스명도 없고 이럴 때는 어떻게 핸들을 찾아 갈것인가??
대략 난감하다.._-_
만약 #32770이 한개라면 findwindowEx()함수에 클래스명을 #32770이라고 써주면 잘 찾게 되지만.
위와같은 구조에서는 자기가 얻고자하는 핸들을 정확히 가지고 올수 없다..
이것을 해결하기 위해서는 트리구조의 원리를 가지고 접근을 해야한다는 것이다.
윈폼에서 작업했던 트리노드를 생각해보자. 자식의 부모의..모 이런식의 개념인 것이다.
그렇다면 여기서 알아야할 API함수가 있다..바로 GetWindow() 라는 함수이고
이함수가 이문제의 해결을 해줄수 있는 해결책이다.

2. GetWindow()함수를 이용하여 핸들값 찾기

C#에서의 선언은 다음과 같다.

[DllImport("user32.dll")]
public static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);

첫번째 인자는 대상이 되는 핸들값이고 바로 두번째가 그 대상핸들의 자식,혹은 바로 아래 핸들.
부모핸들..이런 식으로0~5까지 값으로 구별하여 접근할수가 있는것이다.

const int GW_HWNDFIRST = 0;
const int GW_HWNDLAST = 1;
const int GW_HWNDNEXT = 2;
const int GW_HWNDPREV = 3;
const int GW_OWNER = 4;
const int GW_CHILD = 5;

정의는 다음과 같다.대충 보면 어떤 값들인지 알것이다.
위의 그림을 보자..최상위 핸들값을 hwnd_main이라고 하고
한번 두번째 자식의 값을 가져오고 싶다면 다음과 같이 접근하면될것이다.

int hwnd_first=GetWindow(hwnd_main,GW_CHILD); //첫번째 자식의 핸들값->바로 자식의 핸들값을 가져오므로

int hwnd_second=GetWindow(hwnd_first,GW_HWNDNEXT); //첫번째 아래에 있는 핸들값 바로 두번째 핸들값

이런식으로 접근을 하면 두번째 핸들을 정확히 접근할수 있을 것이다.
이부분의 예제는 생략하겠다. 나중에 핸들을 찾다가 다음과 같이 접근이 불가능 한 상황이 되었다면
GetWindow()함수를 사용하라는 것만 전해주고 싶다.
그럼 핸들에 관련된 여러 API함수를 알아 보도록 하겠다.

3.여러가지 핸들 관련 함수들

*GetWindowText()

[DllImport("user32.dll")]
private static extern int GetWindowText(int hWnd, StringBuilder title, int size);

이 함수는 핸들값을 넘겨주면 그 핸들값이 가지고 있는 캡션값을 반환하여준다.
첫번째 인자는 알아내고자하는 핸들대상이고..그 윈도우의 캡션값은 두번재 인자값으로
반환하여 준다. 세번째는 받을 텍스트값의 최대 크기를 정해주는 것이다.


*ShowWindowAsync()

[DllImport("user32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

이 함수는 윈도우의 창의 상태를 변경시킨다. 두번째 인자값을 어떻게 넘겨주느냐에 따라서 상태가 변하고.
첫번째는 변화시키고자 하는 핸들값이다.
상태에 대한 값은 아래 값들을 참고하길..

private const int SW_HIDE = 0;
private const int SW_SHOWNORMAL = 1;
private const int SW_SHOWMINIMIZED = 2;
private const int SW_SHOWMAXIMIZED = 3;
private const int SW_SHOWNOACTIVATE = 4;
private const int SW_RESTORE = 9;
private const int SW_SHOWDEFAULT = 10;

이밖에도 핸들에 관련된 함수는 많이 있지만 가장 많이 사용하는 함수 두개만 뽑아봤다.

http://www.hoonsbara.com/hoons/lecture/2_1/WindowHiderSource.zip

그리고 이주소는 한 외국 사이트에 있는 api관련 핸들 예제이다. 이 예제를 참고하여 살펴보기를 바라면서.
오늘의 강좌는 여기서 마치도록 하고 내일(혹은 내일모레) 에 강좌에서는 SendMessage()에 관한
자세한 이벤트에 대해서 몇글자 끄적거려 보려고 한다.그럼..


WM_NULL = 0x0000,

        WM_CREATE = 0x0001,

        WM_DESTROY = 0x0002,

        WM_MOVE = 0x0003,

        WM_SIZE = 0x0005,

        WM_ACTIVATE = 0x0006,

        WM_SETFOCUS = 0x0007,

        WM_KILLFOCUS = 0x0008,

        WM_ENABLE = 0x000A,

        WM_SETREDRAW = 0x000B,

        WM_SETTEXT = 0x000C,

        WM_GETTEXT = 0x000D,

        WM_GETTEXTLENGTH = 0x000E,

        WM_PAINT = 0x000F,

        WM_CLOSE = 0x0010,

        WM_QUERYENDSESSION = 0x0011,

        WM_QUERYOPEN = 0x0013,

        WM_ENDSESSION = 0x0016,

        WM_QUIT = 0x0012,

        WM_ERASEBKGND = 0x0014,

        WM_SYSCOLORCHANGE = 0x0015,

        WM_SHOWWINDOW = 0x0018,

        WM_WININICHANGE = 0x001A,

        WM_SETTINGCHANGE = 0x001A,

        WM_DEVMODECHANGE = 0x001B,

        WM_ACTIVATEAPP = 0x001C,

        WM_FONTCHANGE = 0x001D,

        WM_TIMECHANGE = 0x001E,

        WM_CANCELMODE = 0x001F,

        WM_SETCURSOR = 0x0020,

        WM_MOUSEACTIVATE = 0x0021,

        WM_CHILDACTIVATE = 0x0022,

        WM_QUEUESYNC = 0x0023,

        WM_GETMINMAXINFO = 0x0024,

        WM_PAINTICON = 0x0026,

        WM_ICONERASEBKGND = 0x0027,

        WM_NEXTDLGCTL = 0x0028,

        WM_SPOOLERSTATUS = 0x002A,

        WM_DRAWITEM = 0x002B,

        WM_MEASUREITEM = 0x002C,

        WM_DELETEITEM = 0x002D,

        WM_VKEYTOITEM = 0x002E,

        WM_CHARTOITEM = 0x002F,

        WM_SETFONT = 0x0030,

        WM_GETFONT = 0x0031,

        WM_SETHOTKEY = 0x0032,

        WM_GETHOTKEY = 0x0033,

        WM_QUERYDRAGICON = 0x0037,

        WM_COMPAREITEM = 0x0039,

        WM_GETOBJECT = 0x003D,

        WM_COMPACTING = 0x0041,

        WM_COMMNOTIFY = 0x0044,

        WM_WINDOWPOSCHANGING = 0x0046,

        WM_WINDOWPOSCHANGED = 0x0047,

        WM_POWER = 0x0048,

        WM_COPYDATA = 0x004A,

        WM_CANCELJOURNAL = 0x004B,

        WM_NOTIFY = 0x004E,

        WM_INPUTLANGCHANGEREQUEST = 0x0050,

        WM_INPUTLANGCHANGE = 0x0051,

        WM_TCARD = 0x0052,

        WM_HELP = 0x0053,

        WM_USERCHANGED = 0x0054,

        WM_NOTIFYFORMAT = 0x0055,

        WM_CONTEXTMENU = 0x007B,

        WM_STYLECHANGING = 0x007C,

        WM_STYLECHANGED = 0x007D,

        WM_DISPLAYCHANGE = 0x007E,

        WM_GETICON = 0x007F,

        WM_SETICON = 0x0080,

        WM_NCCREATE = 0x0081,

        WM_NCDESTROY = 0x0082,

        WM_NCCALCSIZE = 0x0083,

        WM_NCHITTEST = 0x0084,

        WM_NCPAINT = 0x0085,

        WM_NCACTIVATE = 0x0086,

        WM_GETDLGCODE = 0x0087,

        WM_SYNCPAINT = 0x0088,

        WM_NCMOUSEMOVE = 0x00A0,

        WM_NCLBUTTONDOWN = 0x00A1,

        WM_NCLBUTTONUP = 0x00A2,

        WM_NCLBUTTONDBLCLK = 0x00A3,

        WM_NCRBUTTONDOWN = 0x00A4,

        WM_NCRBUTTONUP = 0x00A5,

        WM_NCRBUTTONDBLCLK = 0x00A6,

        WM_NCMBUTTONDOWN = 0x00A7,

        WM_NCMBUTTONUP = 0x00A8,

        WM_NCMBUTTONDBLCLK = 0x00A9,

        WM_NCXBUTTONDOWN = 0x00AB,

        WM_NCXBUTTONUP = 0x00AC,

        WM_NCXBUTTONDBLCLK = 0x00AD,

        WM_INPUT = 0x00FF,

        WM_KEYFIRST = 0x0100,

        WM_KEYDOWN = 0x0100,

        WM_KEYUP = 0x0101,

        WM_CHAR = 0x0102,

        WM_DEADCHAR = 0x0103,

        WM_SYSKEYDOWN = 0x0104,

        WM_SYSKEYUP = 0x0105,

        WM_SYSCHAR = 0x0106,

        WM_SYSDEADCHAR = 0x0107,

        WM_UNICHAR = 0x0109,

        WM_KEYLAST_NT501 = 0x0109,

        UNICODE_NOCHAR = 0xFFFF,

        WM_KEYLAST_PRE501 = 0x0108,

        WM_IME_STARTCOMPOSITION = 0x010D,

        WM_IME_ENDCOMPOSITION = 0x010E,

        WM_IME_COMPOSITION = 0x010F,

        WM_IME_KEYLAST = 0x010F,

        WM_INITDIALOG = 0x0110,

        WM_COMMAND = 0x0111,

        WM_SYSCOMMAND = 0x0112,

        WM_TIMER = 0x0113,

        WM_HSCROLL = 0x0114,

        WM_VSCROLL = 0x0115,

        WM_INITMENU = 0x0116,

        WM_INITMENUPOPUP = 0x0117,

        WM_MENUSELECT = 0x011F,

        WM_MENUCHAR = 0x0120,

        WM_ENTERIDLE = 0x0121,

        WM_MENURBUTTONUP = 0x0122,

        WM_MENUDRAG = 0x0123,

        WM_MENUGETOBJECT = 0x0124,

        WM_UNINITMENUPOPUP = 0x0125,

        WM_MENUCOMMAND = 0x0126,

        WM_CHANGEUISTATE = 0x0127,

        WM_UPDATEUISTATE = 0x0128,

        WM_QUERYUISTATE = 0x0129,

        WM_CTLCOLORMSGBOX = 0x0132,

        WM_CTLCOLOREDIT = 0x0133,

        WM_CTLCOLORLISTBOX = 0x0134,

        WM_CTLCOLORBTN = 0x0135,

        WM_CTLCOLORDLG = 0x0136,

        WM_CTLCOLORSCROLLBAR = 0x0137,

        WM_CTLCOLORSTATIC = 0x0138,

        WM_MOUSEFIRST = 0x0200,

        WM_MOUSEMOVE = 0x0200,

        WM_LBUTTONDOWN = 0x0201,

        WM_LBUTTONUP = 0x0202,

        WM_LBUTTONDBLCLK = 0x0203,

        WM_RBUTTONDOWN = 0x0204,

        WM_RBUTTONUP = 0x0205,

        WM_RBUTTONDBLCLK = 0x0206,

        WM_MBUTTONDOWN = 0x0207,

        WM_MBUTTONUP = 0x0208,

        WM_MBUTTONDBLCLK = 0x0209,

        WM_MOUSEWHEEL = 0x020A,

        WM_XBUTTONDOWN = 0x020B,

        WM_XBUTTONUP = 0x020C,

        WM_XBUTTONDBLCLK = 0x020D,

        WM_MOUSELAST_5 = 0x020D,

        WM_MOUSELAST_4 = 0x020A,

        WM_MOUSELAST_PRE_4 = 0x0209,

        WM_PARENTNOTIFY = 0x0210,

        WM_ENTERMENULOOP = 0x0211,

        WM_EXITMENULOOP = 0x0212,

        WM_NEXTMENU = 0x0213,

        WM_SIZING = 0x0214,

        WM_CAPTURECHANGED = 0x0215,

        WM_MOVING = 0x0216,

        WM_POWERBROADCAST = 0x0218,

        WM_DEVICECHANGE = 0x0219,

        WM_MDICREATE = 0x0220,

        WM_MDIDESTROY = 0x0221,

        WM_MDIACTIVATE = 0x0222,

        WM_MDIRESTORE = 0x0223,

        WM_MDINEXT = 0x0224,

        WM_MDIMAXIMIZE = 0x0225,

        WM_MDITILE = 0x0226,

        WM_MDICASCADE = 0x0227,

        WM_MDIICONARRANGE = 0x0228,

        WM_MDIGETACTIVE = 0x0229,

        WM_MDISETMENU = 0x0230,

        WM_ENTERSIZEMOVE = 0x0231,

        WM_EXITSIZEMOVE = 0x0232,

        WM_DROPFILES = 0x0233,

        WM_MDIREFRESHMENU = 0x0234,

        WM_IME_SETCONTEXT = 0x0281,

        WM_IME_NOTIFY = 0x0282,

        WM_IME_CONTROL = 0x0283,

        WM_IME_COMPOSITIONFULL = 0x0284,

        WM_IME_SELECT = 0x0285,

        WM_IME_CHAR = 0x0286,

        WM_IME_REQUEST = 0x0288,

        WM_IME_KEYDOWN = 0x0290,

        WM_IME_KEYUP = 0x0291,

        WM_MOUSEHOVER = 0x02A1,

        WM_MOUSELEAVE = 0x02A3,

        WM_NCMOUSEHOVER = 0x02A0,

        WM_NCMOUSELEAVE = 0x02A2,

        WM_WTSSESSION_CHANGE = 0x02B1,

        WM_TABLET_FIRST = 0x02c0,

        WM_TABLET_LAST = 0x02df,

        WM_CUT = 0x0300,

        WM_COPY = 0x0301,

        WM_PASTE = 0x0302,

        WM_CLEAR = 0x0303,

        WM_UNDO = 0x0304,

        WM_RENDERFORMAT = 0x0305,

        WM_RENDERALLFORMATS = 0x0306,

        WM_DESTROYCLIPBOARD = 0x0307,

        WM_DRAWCLIPBOARD = 0x0308,

        WM_PAINTCLIPBOARD = 0x0309,

        WM_VSCROLLCLIPBOARD = 0x030A,

        WM_SIZECLIPBOARD = 0x030B,

        WM_ASKCBFORMATNAME = 0x030C,

        WM_CHANGECBCHAIN = 0x030D,

        WM_HSCROLLCLIPBOARD = 0x030E,

        WM_QUERYNEWPALETTE = 0x030F,

        WM_PALETTEISCHANGING = 0x0310,

        WM_PALETTECHANGED = 0x0311,

        WM_HOTKEY = 0x0312,

        WM_PRINT = 0x0317,

        WM_PRINTCLIENT = 0x0318,

        WM_APPCOMMAND = 0x0319,

        WM_THEMECHANGED = 0x031A,

        WM_HANDHELDFIRST = 0x0358,

        WM_HANDHELDLAST = 0x035F,

        WM_AFXFIRST = 0x0360,

        WM_AFXLAST = 0x037F,

        WM_PENWINFIRST = 0x0380,

        WM_PENWINLAST = 0x038F,

        WM_APP = 0x8000,

        WM_USER = 0x0400,

        EM_GETSEL = 0x00B0,

        EM_SETSEL = 0x00B1,

        EM_GETRECT = 0x00B2,

        EM_SETRECT = 0x00B3,

        EM_SETRECTNP = 0x00B4,

        EM_SCROLL = 0x00B5,

        EM_LINESCROLL = 0x00B6,

        EM_SCROLLCARET = 0x00B7,

        EM_GETMODIFY = 0x00B8,

        EM_SETMODIFY = 0x00B9,

        EM_GETLINECOUNT = 0x00BA,

        EM_LINEINDEX = 0x00BB,

        EM_SETHANDLE = 0x00BC,

        EM_GETHANDLE = 0x00BD,

        EM_GETTHUMB = 0x00BE,

        EM_LINELENGTH = 0x00C1,

        EM_REPLACESEL = 0x00C2,

        EM_GETLINE = 0x00C4,

        EM_LIMITTEXT = 0x00C5,

        EM_CANUNDO = 0x00C6,

        EM_UNDO = 0x00C7,

        EM_FMTLINES = 0x00C8,

        EM_LINEFROMCHAR = 0x00C9,

        EM_SETTABSTOPS = 0x00CB,

        EM_SETPASSWORDCHAR = 0x00CC,

        EM_EMPTYUNDOBUFFER = 0x00CD,

        EM_GETFIRSTVISIBLELINE = 0x00CE,

        EM_SETREADONLY = 0x00CF,

        EM_SETWORDBREAKPROC = 0x00D0,

        EM_GETWORDBREAKPROC = 0x00D1,

        EM_GETPASSWORDCHAR = 0x00D2,

        EM_SETMARGINS = 0x00D3,

        EM_GETMARGINS = 0x00D4,

        EM_SETLIMITTEXT = EM_LIMITTEXT,

        EM_GETLIMITTEXT = 0x00D5,

        EM_POSFROMCHAR = 0x00D6,

        EM_CHARFROMPOS = 0x00D7,

        EM_SETIMESTATUS = 0x00D8,

        EM_GETIMESTATUS = 0x00D9,

        BM_GETCHECK= 0x00F0,

        BM_SETCHECK= 0x00F1,

        BM_GETSTATE= 0x00F2,

        BM_SETSTATE= 0x00F3,

        BM_SETSTYLE= 0x00F4,

        BM_CLICK = 0x00F5,

        BM_GETIMAGE= 0x00F6,

        BM_SETIMAGE= 0x00F7,

        STM_SETICON = 0x0170,

        STM_GETICON = 0x0171,

        STM_SETIMAGE = 0x0172,

        STM_GETIMAGE = 0x0173,

        STM_MSGMAX = 0x0174,

        DM_GETDEFID = (WM_USER+0),

        DM_SETDEFID = (WM_USER+1),

        DM_REPOSITION = (WM_USER+2),

        LB_ADDSTRING = 0x0180,

        LB_INSERTSTRING = 0x0181,

        LB_DELETESTRING = 0x0182,

        LB_SELITEMRANGEEX= 0x0183,

        LB_RESETCONTENT = 0x0184,

        LB_SETSEL = 0x0185,

        LB_SETCURSEL = 0x0186,

        LB_GETSEL = 0x0187,

        LB_GETCURSEL = 0x0188,

        LB_GETTEXT = 0x0189,

        LB_GETTEXTLEN = 0x018A,

        LB_GETCOUNT = 0x018B,

        LB_SELECTSTRING = 0x018C,

        LB_DIR = 0x018D,

        LB_GETTOPINDEX = 0x018E,

        LB_FINDSTRING = 0x018F,

        LB_GETSELCOUNT = 0x0190,

        LB_GETSELITEMS = 0x0191,

        LB_SETTABSTOPS = 0x0192,

        LB_GETHORIZONTALEXTENT = 0x0193,

        LB_SETHORIZONTALEXTENT = 0x0194,

        LB_SETCOLUMNWIDTH = 0x0195,

        LB_ADDFILE = 0x0196,

        LB_SETTOPINDEX = 0x0197,

        LB_GETITEMRECT = 0x0198,

        LB_GETITEMDATA = 0x0199,

        LB_SETITEMDATA = 0x019A,

        LB_SELITEMRANGE = 0x019B,

        LB_SETANCHORINDEX = 0x019C,

        LB_GETANCHORINDEX = 0x019D,

        LB_SETCARETINDEX = 0x019E,

        LB_GETCARETINDEX = 0x019F,

        LB_SETITEMHEIGHT = 0x01A0,

        LB_GETITEMHEIGHT = 0x01A1,

        LB_FINDSTRINGEXACT = 0x01A2,

        LB_SETLOCALE = 0x01A5,

        LB_GETLOCALE = 0x01A6,

        LB_SETCOUNT = 0x01A7,

        LB_INITSTORAGE = 0x01A8,

        LB_ITEMFROMPOINT = 0x01A9,

        LB_MULTIPLEADDSTRING = 0x01B1,

        LB_GETLISTBOXINFO= 0x01B2,

        LB_MSGMAX_501 = 0x01B3,

        LB_MSGMAX_WCE4 = 0x01B1,

        LB_MSGMAX_4 = 0x01B0,

        LB_MSGMAX_PRE4 = 0x01A8,

        CB_GETEDITSEL = 0x0140,

        CB_LIMITTEXT = 0x0141,

        CB_SETEDITSEL = 0x0142,

        CB_ADDSTRING = 0x0143,

        CB_DELETESTRING = 0x0144,

        CB_DIR = 0x0145,

        CB_GETCOUNT = 0x0146,

        CB_GETCURSEL = 0x0147,

        CB_GETLBTEXT = 0x0148,

        CB_GETLBTEXTLEN = 0x0149,

        CB_INSERTSTRING = 0x014A,

        CB_RESETCONTENT = 0x014B,

        CB_FINDSTRING = 0x014C,

        CB_SELECTSTRING = 0x014D,

        CB_SETCURSEL = 0x014E,

        CB_SHOWDROPDOWN = 0x014F,

        CB_GETITEMDATA = 0x0150,

        CB_SETITEMDATA = 0x0151,

        CB_GETDROPPEDCONTROLRECT = 0x0152,

        CB_SETITEMHEIGHT = 0x0153,

        CB_GETITEMHEIGHT = 0x0154,

        CB_SETEXTENDEDUI = 0x0155,

        CB_GETEXTENDEDUI = 0x0156,

        CB_GETDROPPEDSTATE = 0x0157,

        CB_FINDSTRINGEXACT = 0x0158,

        CB_SETLOCALE = 0x0159,

        CB_GETLOCALE = 0x015A,

        CB_GETTOPINDEX = 0x015B,

        CB_SETTOPINDEX = 0x015C,

        CB_GETHORIZONTALEXTENT = 0x015d,

        CB_SETHORIZONTALEXTENT = 0x015e,

        CB_GETDROPPEDWIDTH = 0x015f,

        CB_SETDROPPEDWIDTH = 0x0160,

        CB_INITSTORAGE = 0x0161,

        CB_MULTIPLEADDSTRING = 0x0163,

        CB_GETCOMBOBOXINFO = 0x0164,

        CB_MSGMAX_501 = 0x0165,

        CB_MSGMAX_WCE400 = 0x0163,

        CB_MSGMAX_400 = 0x0162,

        CB_MSGMAX_PRE400 = 0x015B,

        SBM_SETPOS = 0x00E0,

        SBM_GETPOS = 0x00E1,

        SBM_SETRANGE = 0x00E2,

        SBM_SETRANGEREDRAW = 0x00E6,

        SBM_GETRANGE = 0x00E3,

        SBM_ENABLE_ARROWS = 0x00E4,

        SBM_SETSCROLLINFO = 0x00E9,

        SBM_GETSCROLLINFO = 0x00EA,

        SBM_GETSCROLLBARINFO= 0x00EB,

        LVM_FIRST = 0x1000,// ListView messages

        TV_FIRST = 0x1100,// TreeView messages

        HDM_FIRST = 0x1200,// Header messages

        TCM_FIRST = 0x1300,// Tab control messages

        PGM_FIRST = 0x1400,// Pager control messages

        ECM_FIRST = 0x1500,// Edit control messages

        BCM_FIRST = 0x1600,// Button control messages

        CBM_FIRST = 0x1700,// Combobox control messages

        CCM_FIRST = 0x2000,// Common control shared messages

        CCM_LAST =(CCM_FIRST + 0x200),

        CCM_SETBKCOLOR = (CCM_FIRST + 1),

        CCM_SETCOLORSCHEME = (CCM_FIRST + 2),

        CCM_GETCOLORSCHEME = (CCM_FIRST + 3),

        CCM_GETDROPTARGET = (CCM_FIRST + 4),

        CCM_SETUNICODEFORMAT = (CCM_FIRST + 5),

        CCM_GETUNICODEFORMAT = (CCM_FIRST + 6),

        CCM_SETVERSION = (CCM_FIRST + 0x7),

        CCM_GETVERSION = (CCM_FIRST + 0x8),

        CCM_SETNOTIFYWINDOW = (CCM_FIRST + 0x9),

        CCM_SETWINDOWTHEME = (CCM_FIRST + 0xb),

        CCM_DPISCALE = (CCM_FIRST + 0xc),

        HDM_GETITEMCOUNT = (HDM_FIRST + 0),

        HDM_INSERTITEMA = (HDM_FIRST + 1),

        HDM_INSERTITEMW = (HDM_FIRST + 10),

        HDM_DELETEITEM = (HDM_FIRST + 2),

        HDM_GETITEMA = (HDM_FIRST + 3),

        HDM_GETITEMW = (HDM_FIRST + 11),

        HDM_SETITEMA = (HDM_FIRST + 4),

        HDM_SETITEMW = (HDM_FIRST + 12),

        HDM_LAYOUT = (HDM_FIRST + 5),

        HDM_HITTEST = (HDM_FIRST + 6),

        HDM_GETITEMRECT = (HDM_FIRST + 7),

        HDM_SETIMAGELIST = (HDM_FIRST + 8),

        HDM_GETIMAGELIST = (HDM_FIRST + 9),

        HDM_ORDERTOINDEX = (HDM_FIRST + 15),

        HDM_CREATEDRAGIMAGE = (HDM_FIRST + 16),

        HDM_GETORDERARRAY = (HDM_FIRST + 17),

        HDM_SETORDERARRAY = (HDM_FIRST + 18),

        HDM_SETHOTDIVIDER = (HDM_FIRST + 19),

        HDM_SETBITMAPMARGIN = (HDM_FIRST + 20),

        HDM_GETBITMAPMARGIN = (HDM_FIRST + 21),

        HDM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,

        HDM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,

        HDM_SETFILTERCHANGETIMEOUT = (HDM_FIRST+22),

        HDM_EDITFILTER = (HDM_FIRST+23),

        HDM_CLEARFILTER = (HDM_FIRST+24),

        TB_ENABLEBUTTON = (WM_USER + 1),

        TB_CHECKBUTTON = (WM_USER + 2),

        TB_PRESSBUTTON = (WM_USER + 3),

        TB_HIDEBUTTON = (WM_USER + 4),

        TB_INDETERMINATE = (WM_USER + 5),

        TB_MARKBUTTON = (WM_USER + 6),

        TB_ISBUTTONENABLED = (WM_USER + 9),

        TB_ISBUTTONCHECKED = (WM_USER + 10),

        TB_ISBUTTONPRESSED = (WM_USER + 11),

        TB_ISBUTTONHIDDEN = (WM_USER + 12),

        TB_ISBUTTONINDETERMINATE = (WM_USER + 13),

        TB_ISBUTTONHIGHLIGHTED = (WM_USER + 14),

        TB_SETSTATE = (WM_USER + 17),

        TB_GETSTATE = (WM_USER + 18),

        TB_ADDBITMAP = (WM_USER + 19),

        TB_ADDBUTTONSA = (WM_USER + 20),

        TB_INSERTBUTTONA = (WM_USER + 21),

        TB_ADDBUTTONS = (WM_USER + 20),

        TB_INSERTBUTTON = (WM_USER + 21),

        TB_DELETEBUTTON = (WM_USER + 22),

        TB_GETBUTTON = (WM_USER + 23),

        TB_BUTTONCOUNT = (WM_USER + 24),

        TB_COMMANDTOINDEX = (WM_USER + 25),

        TB_SAVERESTOREA = (WM_USER + 26),

        TB_SAVERESTOREW = (WM_USER + 76),

        TB_CUSTOMIZE = (WM_USER + 27),

        TB_ADDSTRINGA = (WM_USER + 28),

        TB_ADDSTRINGW = (WM_USER + 77),

        TB_GETITEMRECT = (WM_USER + 29),

        TB_BUTTONSTRUCTSIZE = (WM_USER + 30),

        TB_SETBUTTONSIZE = (WM_USER + 31),

        TB_SETBITMAPSIZE = (WM_USER + 32),

        TB_AUTOSIZE = (WM_USER + 33),

        TB_GETTOOLTIPS = (WM_USER + 35),

        TB_SETTOOLTIPS = (WM_USER + 36),

        TB_SETPARENT = (WM_USER + 37),

        TB_SETROWS = (WM_USER + 39),

        TB_GETROWS = (WM_USER + 40),

        TB_SETCMDID = (WM_USER + 42),

        TB_CHANGEBITMAP = (WM_USER + 43),

        TB_GETBITMAP = (WM_USER + 44),

        TB_GETBUTTONTEXTA = (WM_USER + 45),

        TB_GETBUTTONTEXTW = (WM_USER + 75),

        TB_REPLACEBITMAP = (WM_USER + 46),

        TB_SETINDENT = (WM_USER + 47),

        TB_SETIMAGELIST = (WM_USER + 48),

        TB_GETIMAGELIST = (WM_USER + 49),

        TB_LOADIMAGES = (WM_USER + 50),

        TB_GETRECT = (WM_USER + 51),

        TB_SETHOTIMAGELIST = (WM_USER + 52),

        TB_GETHOTIMAGELIST = (WM_USER + 53),

        TB_SETDISABLEDIMAGELIST = (WM_USER + 54),

        TB_GETDISABLEDIMAGELIST = (WM_USER + 55),

        TB_SETSTYLE = (WM_USER + 56),

        TB_GETSTYLE = (WM_USER + 57),

        TB_GETBUTTONSIZE = (WM_USER + 58),

        TB_SETBUTTONWIDTH = (WM_USER + 59),

        TB_SETMAXTEXTROWS = (WM_USER + 60),

        TB_GETTEXTROWS = (WM_USER + 61),

        TB_GETOBJECT = (WM_USER + 62),

        TB_GETHOTITEM = (WM_USER + 71),

        TB_SETHOTITEM = (WM_USER + 72),

        TB_SETANCHORHIGHLIGHT = (WM_USER + 73),

        TB_GETANCHORHIGHLIGHT = (WM_USER + 74),

        TB_MAPACCELERATORA = (WM_USER + 78),

        TB_GETINSERTMARK = (WM_USER + 79),

        TB_SETINSERTMARK = (WM_USER + 80),

        TB_INSERTMARKHITTEST = (WM_USER + 81),

        TB_MOVEBUTTON = (WM_USER + 82),

        TB_GETMAXSIZE = (WM_USER + 83),

        TB_SETEXTENDEDSTYLE = (WM_USER + 84),

        TB_GETEXTENDEDSTYLE = (WM_USER + 85),

        TB_GETPADDING = (WM_USER + 86),

        TB_SETPADDING = (WM_USER + 87),

        TB_SETINSERTMARKCOLOR = (WM_USER + 88),

        TB_GETINSERTMARKCOLOR = (WM_USER + 89),

        TB_SETCOLORSCHEME = CCM_SETCOLORSCHEME,

        TB_GETCOLORSCHEME = CCM_GETCOLORSCHEME,

        TB_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,

        TB_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,

        TB_MAPACCELERATORW = (WM_USER + 90),

        TB_GETBITMAPFLAGS = (WM_USER + 41),

        TB_GETBUTTONINFOW = (WM_USER + 63),

        TB_SETBUTTONINFOW = (WM_USER + 64),

        TB_GETBUTTONINFOA = (WM_USER + 65),

        TB_SETBUTTONINFOA = (WM_USER + 66),

        TB_INSERTBUTTONW = (WM_USER + 67),

        TB_ADDBUTTONSW = (WM_USER + 68),

        TB_HITTEST = (WM_USER + 69),

        TB_SETDRAWTEXTFLAGS = (WM_USER + 70),

        TB_GETSTRINGW = (WM_USER + 91),

        TB_GETSTRINGA = (WM_USER + 92),

        TB_GETMETRICS = (WM_USER + 101),

        TB_SETMETRICS = (WM_USER + 102),

        TB_SETWINDOWTHEME = CCM_SETWINDOWTHEME,

        RB_INSERTBANDA = (WM_USER + 1),

        RB_DELETEBAND = (WM_USER + 2),

        RB_GETBARINFO = (WM_USER + 3),

        RB_SETBARINFO = (WM_USER + 4),

        RB_GETBANDINFO = (WM_USER + 5),

        RB_SETBANDINFOA = (WM_USER + 6),

        RB_SETPARENT = (WM_USER + 7),

        RB_HITTEST = (WM_USER + 8),

        RB_GETRECT = (WM_USER + 9),

        RB_INSERTBANDW = (WM_USER + 10),

        RB_SETBANDINFOW = (WM_USER + 11),

        RB_GETBANDCOUNT = (WM_USER + 12),

        RB_GETROWCOUNT = (WM_USER + 13),

        RB_GETROWHEIGHT = (WM_USER + 14),

        RB_IDTOINDEX = (WM_USER + 16),

        RB_GETTOOLTIPS = (WM_USER + 17),

        RB_SETTOOLTIPS = (WM_USER + 18),

        RB_SETBKCOLOR = (WM_USER + 19),

        RB_GETBKCOLOR = (WM_USER + 20),

        RB_SETTEXTCOLOR = (WM_USER + 21),

        RB_GETTEXTCOLOR = (WM_USER + 22),

        RB_SIZETORECT = (WM_USER + 23),

        RB_SETCOLORSCHEME = CCM_SETCOLORSCHEME,

        RB_GETCOLORSCHEME = CCM_GETCOLORSCHEME,

        RB_BEGINDRAG = (WM_USER + 24),

        RB_ENDDRAG = (WM_USER + 25),

        RB_DRAGMOVE = (WM_USER + 26),

        RB_GETBARHEIGHT = (WM_USER + 27),

        RB_GETBANDINFOW = (WM_USER + 28),

        RB_GETBANDINFOA = (WM_USER + 29),

        RB_MINIMIZEBAND = (WM_USER + 30),

        RB_MAXIMIZEBAND = (WM_USER + 31),

        RB_GETDROPTARGET = (CCM_GETDROPTARGET),

        RB_GETBANDBORDERS = (WM_USER + 34),

        RB_SHOWBAND = (WM_USER + 35),

        RB_SETPALETTE = (WM_USER + 37),

        RB_GETPALETTE = (WM_USER + 38),

        RB_MOVEBAND = (WM_USER + 39),

        RB_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,

        RB_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,

        RB_GETBANDMARGINS = (WM_USER + 40),

        RB_SETWINDOWTHEME = CCM_SETWINDOWTHEME,

        RB_PUSHCHEVRON = (WM_USER + 43),

        TTM_ACTIVATE = (WM_USER + 1),

        TTM_SETDELAYTIME = (WM_USER + 3),

        TTM_ADDTOOLA = (WM_USER + 4),

        TTM_ADDTOOLW = (WM_USER + 50),

        TTM_DELTOOLA = (WM_USER + 5),

        TTM_DELTOOLW = (WM_USER + 51),

        TTM_NEWTOOLRECTA = (WM_USER + 6),

        TTM_NEWTOOLRECTW = (WM_USER + 52),

        TTM_RELAYEVENT = (WM_USER + 7),

        TTM_GETTOOLINFOA = (WM_USER + 8),

        TTM_GETTOOLINFOW = (WM_USER + 53),

        TTM_SETTOOLINFOA = (WM_USER + 9),

        TTM_SETTOOLINFOW = (WM_USER + 54),

        TTM_HITTESTA = (WM_USER +10),

        TTM_HITTESTW = (WM_USER +55),

        TTM_GETTEXTA = (WM_USER +11),

        TTM_GETTEXTW = (WM_USER +56),

        TTM_UPDATETIPTEXTA = (WM_USER +12),

        TTM_UPDATETIPTEXTW = (WM_USER +57),

        TTM_GETTOOLCOUNT = (WM_USER +13),

        TTM_ENUMTOOLSA = (WM_USER +14),

        TTM_ENUMTOOLSW = (WM_USER +58),

        TTM_GETCURRENTTOOLA = (WM_USER + 15),

        TTM_GETCURRENTTOOLW = (WM_USER + 59),

        TTM_WINDOWFROMPOINT = (WM_USER + 16),

        TTM_TRACKACTIVATE = (WM_USER + 17),

        TTM_TRACKPOSITION = (WM_USER + 18),

        TTM_SETTIPBKCOLOR = (WM_USER + 19),

        TTM_SETTIPTEXTCOLOR = (WM_USER + 20),

        TTM_GETDELAYTIME = (WM_USER + 21),

        TTM_GETTIPBKCOLOR = (WM_USER + 22),

        TTM_GETTIPTEXTCOLOR = (WM_USER + 23),

        TTM_SETMAXTIPWIDTH = (WM_USER + 24),

        TTM_GETMAXTIPWIDTH = (WM_USER + 25),

        TTM_SETMARGIN = (WM_USER + 26),

        TTM_GETMARGIN = (WM_USER + 27),

        TTM_POP = (WM_USER + 28),

        TTM_UPDATE = (WM_USER + 29),

        TTM_GETBUBBLESIZE = (WM_USER + 30),

        TTM_ADJUSTRECT = (WM_USER + 31),

        TTM_SETTITLEA = (WM_USER + 32),

        TTM_SETTITLEW = (WM_USER + 33),

        TTM_POPUP = (WM_USER + 34),

        TTM_GETTITLE = (WM_USER + 35),

        TTM_SETWINDOWTHEME = CCM_SETWINDOWTHEME,

        SB_SETTEXTA = (WM_USER+1),

        SB_SETTEXTW = (WM_USER+11),

        SB_GETTEXTA = (WM_USER+2),

        SB_GETTEXTW = (WM_USER+13),

        SB_GETTEXTLENGTHA = (WM_USER+3),

        SB_GETTEXTLENGTHW = (WM_USER+12),

        SB_SETPARTS = (WM_USER+4),

        SB_GETPARTS = (WM_USER+6),

        SB_GETBORDERS = (WM_USER+7),

        SB_SETMINHEIGHT = (WM_USER+8),

        SB_SIMPLE = (WM_USER+9),

        SB_GETRECT = (WM_USER+10),

        SB_ISSIMPLE = (WM_USER+14),

        SB_SETICON = (WM_USER+15),

        SB_SETTIPTEXTA = (WM_USER+16),

        SB_SETTIPTEXTW = (WM_USER+17),

        SB_GETTIPTEXTA = (WM_USER+18),

        SB_GETTIPTEXTW = (WM_USER+19),

        SB_GETICON = (WM_USER+20),

        SB_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,

        SB_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,

        SB_SETBKCOLOR = CCM_SETBKCOLOR,

        SB_SIMPLEID = 0x00ff,

        TBM_GETPOS = (WM_USER),

        TBM_GETRANGEMIN = (WM_USER+1),

        TBM_GETRANGEMAX = (WM_USER+2),

        TBM_GETTIC = (WM_USER+3),

        TBM_SETTIC = (WM_USER+4),

        TBM_SETPOS = (WM_USER+5),

        TBM_SETRANGE = (WM_USER+6),

        TBM_SETRANGEMIN = (WM_USER+7),

        TBM_SETRANGEMAX = (WM_USER+8),

        TBM_CLEARTICS = (WM_USER+9),

        TBM_SETSEL = (WM_USER+10),

        TBM_SETSELSTART = (WM_USER+11),

        TBM_SETSELEND = (WM_USER+12),

        TBM_GETPTICS = (WM_USER+14),

        TBM_GETTICPOS = (WM_USER+15),

        TBM_GETNUMTICS = (WM_USER+16),

        TBM_GETSELSTART = (WM_USER+17),

        TBM_GETSELEND = (WM_USER+18),

        TBM_CLEARSEL = (WM_USER+19),

        TBM_SETTICFREQ = (WM_USER+20),

        TBM_SETPAGESIZE = (WM_USER+21),

        TBM_GETPAGESIZE = (WM_USER+22),

        TBM_SETLINESIZE = (WM_USER+23),

        TBM_GETLINESIZE = (WM_USER+24),

        TBM_GETTHUMBRECT = (WM_USER+25),

        TBM_GETCHANNELRECT = (WM_USER+26),

        TBM_SETTHUMBLENGTH = (WM_USER+27),

        TBM_GETTHUMBLENGTH = (WM_USER+28),

        TBM_SETTOOLTIPS = (WM_USER+29),

        TBM_GETTOOLTIPS = (WM_USER+30),

        TBM_SETTIPSIDE = (WM_USER+31),

        TBM_SETBUDDY = (WM_USER+32),

        TBM_GETBUDDY = (WM_USER+33),

        TBM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,

        TBM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,

        DL_BEGINDRAG = (WM_USER+133),

        DL_DRAGGING = (WM_USER+134),

        DL_DROPPED = (WM_USER+135),

        DL_CANCELDRAG = (WM_USER+136),

        UDM_SETRANGE = (WM_USER+101),

        UDM_GETRANGE = (WM_USER+102),

        UDM_SETPOS = (WM_USER+103),

        UDM_GETPOS = (WM_USER+104),

        UDM_SETBUDDY = (WM_USER+105),

        UDM_GETBUDDY = (WM_USER+106),

        UDM_SETACCEL = (WM_USER+107),

        UDM_GETACCEL = (WM_USER+108),

        UDM_SETBASE = (WM_USER+109),

        UDM_GETBASE = (WM_USER+110),

        UDM_SETRANGE32 = (WM_USER+111),

        UDM_GETRANGE32 = (WM_USER+112),

        UDM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,

        UDM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,

        UDM_SETPOS32 = (WM_USER+113),

        UDM_GETPOS32 = (WM_USER+114),

        PBM_SETRANGE = (WM_USER+1),

        PBM_SETPOS = (WM_USER+2),

        PBM_DELTAPOS = (WM_USER+3),

        PBM_SETSTEP = (WM_USER+4),

        PBM_STEPIT = (WM_USER+5),

        PBM_SETRANGE32 = (WM_USER+6),

        PBM_GETRANGE = (WM_USER+7),

        PBM_GETPOS = (WM_USER+8),

        PBM_SETBARCOLOR = (WM_USER+9),

        PBM_SETBKCOLOR = CCM_SETBKCOLOR,

        HKM_SETHOTKEY = (WM_USER+1),

        HKM_GETHOTKEY = (WM_USER+2),

        HKM_SETRULES = (WM_USER+3),

        LVM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,

        LVM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,

        LVM_GETBKCOLOR = (LVM_FIRST + 0),

        LVM_SETBKCOLOR = (LVM_FIRST + 1),

        LVM_GETIMAGELIST = (LVM_FIRST + 2),

        LVM_SETIMAGELIST = (LVM_FIRST + 3),

        LVM_GETITEMCOUNT = (LVM_FIRST + 4),

        LVM_GETITEMA = (LVM_FIRST + 5),

        LVM_GETITEMW = (LVM_FIRST + 75),

        LVM_SETITEMA = (LVM_FIRST + 6),

        LVM_SETITEMW = (LVM_FIRST + 76),

        LVM_INSERTITEMA = (LVM_FIRST + 7),

        LVM_INSERTITEMW = (LVM_FIRST + 77),

        LVM_DELETEITEM = (LVM_FIRST + 8),

        LVM_DELETEALLITEMS = (LVM_FIRST + 9),

        LVM_GETCALLBACKMASK = (LVM_FIRST + 10),

        LVM_SETCALLBACKMASK = (LVM_FIRST + 11),

        LVM_FINDITEMA = (LVM_FIRST + 13),

        LVM_FINDITEMW = (LVM_FIRST + 83),

        LVM_GETITEMRECT = (LVM_FIRST + 14),

        LVM_SETITEMPOSITION = (LVM_FIRST + 15),

        LVM_GETITEMPOSITION = (LVM_FIRST + 16),

        LVM_GETSTRINGWIDTHA = (LVM_FIRST + 17),

        LVM_GETSTRINGWIDTHW = (LVM_FIRST + 87),

        LVM_HITTEST = (LVM_FIRST + 18),

        LVM_ENSUREVISIBLE = (LVM_FIRST + 19),

        LVM_SCROLL = (LVM_FIRST + 20),

        LVM_REDRAWITEMS = (LVM_FIRST + 21),

        LVM_ARRANGE = (LVM_FIRST + 22),

        LVM_EDITLABELA = (LVM_FIRST + 23),

        LVM_EDITLABELW = (LVM_FIRST + 118),

        LVM_GETEDITCONTROL = (LVM_FIRST + 24),

        LVM_GETCOLUMNA = (LVM_FIRST + 25),

        LVM_GETCOLUMNW = (LVM_FIRST + 95),

        LVM_SETCOLUMNA = (LVM_FIRST + 26),

        LVM_SETCOLUMNW = (LVM_FIRST + 96),

        LVM_INSERTCOLUMNA = (LVM_FIRST + 27),

        LVM_INSERTCOLUMNW = (LVM_FIRST + 97),

        LVM_DELETECOLUMN = (LVM_FIRST + 28),

        LVM_GETCOLUMNWIDTH = (LVM_FIRST + 29),

        LVM_SETCOLUMNWIDTH = (LVM_FIRST + 30),

        LVM_CREATEDRAGIMAGE = (LVM_FIRST + 33),

        LVM_GETVIEWRECT = (LVM_FIRST + 34),

        LVM_GETTEXTCOLOR = (LVM_FIRST + 35),

        LVM_SETTEXTCOLOR = (LVM_FIRST + 36),

        LVM_GETTEXTBKCOLOR = (LVM_FIRST + 37),

        LVM_SETTEXTBKCOLOR = (LVM_FIRST + 38),

        LVM_GETTOPINDEX = (LVM_FIRST + 39),

        LVM_GETCOUNTPERPAGE = (LVM_FIRST + 40),

        LVM_GETORIGIN = (LVM_FIRST + 41),

        LVM_UPDATE = (LVM_FIRST + 42),

        LVM_SETITEMSTATE = (LVM_FIRST + 43),

        LVM_GETITEMSTATE = (LVM_FIRST + 44),

        LVM_GETITEMTEXTA = (LVM_FIRST + 45),

        LVM_GETITEMTEXTW = (LVM_FIRST + 115),

        LVM_SETITEMTEXTA = (LVM_FIRST + 46),

        LVM_SETITEMTEXTW = (LVM_FIRST + 116),

        LVM_SETITEMCOUNT = (LVM_FIRST + 47),

        LVM_SORTITEMS = (LVM_FIRST + 48),

        LVM_SETITEMPOSITION32 = (LVM_FIRST + 49),

        LVM_GETSELECTEDCOUNT = (LVM_FIRST + 50),

        LVM_GETITEMSPACING = (LVM_FIRST + 51),

        LVM_GETISEARCHSTRINGA = (LVM_FIRST + 52),

        LVM_GETISEARCHSTRINGW = (LVM_FIRST + 117),

        LVM_SETICONSPACING = (LVM_FIRST + 53),

        LVM_SETEXTENDEDLISTVIEWSTYLE = (LVM_FIRST + 54),

        LVM_GETEXTENDEDLISTVIEWSTYLE = (LVM_FIRST + 55),

        LVM_GETSUBITEMRECT = (LVM_FIRST + 56),

        LVM_SUBITEMHITTEST = (LVM_FIRST + 57),

        LVM_SETCOLUMNORDERARRAY = (LVM_FIRST + 58),

        LVM_GETCOLUMNORDERARRAY = (LVM_FIRST + 59),

        LVM_SETHOTITEM = (LVM_FIRST + 60),

        LVM_GETHOTITEM = (LVM_FIRST + 61),

        LVM_SETHOTCURSOR = (LVM_FIRST + 62),

        LVM_GETHOTCURSOR = (LVM_FIRST + 63),

        LVM_APPROXIMATEVIEWRECT = (LVM_FIRST + 64),

        LVM_SETWORKAREAS = (LVM_FIRST + 65),

        LVM_GETWORKAREAS = (LVM_FIRST + 70),

        LVM_GETNUMBEROFWORKAREAS = (LVM_FIRST + 73),

        LVM_GETSELECTIONMARK = (LVM_FIRST + 66),

        LVM_SETSELECTIONMARK = (LVM_FIRST + 67),

        LVM_SETHOVERTIME = (LVM_FIRST + 71),

        LVM_GETHOVERTIME = (LVM_FIRST + 72),

        LVM_SETTOOLTIPS = (LVM_FIRST + 74),

        LVM_GETTOOLTIPS = (LVM_FIRST + 78),

        LVM_SORTITEMSEX = (LVM_FIRST + 81),

        LVM_SETBKIMAGEA = (LVM_FIRST + 68),

        LVM_SETBKIMAGEW = (LVM_FIRST + 138),

        LVM_GETBKIMAGEA = (LVM_FIRST + 69),

        LVM_GETBKIMAGEW = (LVM_FIRST + 139),

        LVM_SETSELECTEDCOLUMN = (LVM_FIRST + 140),

        LVM_SETTILEWIDTH = (LVM_FIRST + 141),

        LVM_SETVIEW = (LVM_FIRST + 142),

        LVM_GETVIEW = (LVM_FIRST + 143),

        LVM_INSERTGROUP = (LVM_FIRST + 145),

        LVM_SETGROUPINFO = (LVM_FIRST + 147),

        LVM_GETGROUPINFO = (LVM_FIRST + 149),

        LVM_REMOVEGROUP = (LVM_FIRST + 150),

        LVM_MOVEGROUP = (LVM_FIRST + 151),

        LVM_MOVEITEMTOGROUP = (LVM_FIRST + 154),

        LVM_SETGROUPMETRICS = (LVM_FIRST + 155),

        LVM_GETGROUPMETRICS = (LVM_FIRST + 156),

        LVM_ENABLEGROUPVIEW = (LVM_FIRST + 157),

        LVM_SORTGROUPS = (LVM_FIRST + 158),

        LVM_INSERTGROUPSORTED = (LVM_FIRST + 159),

        LVM_REMOVEALLGROUPS = (LVM_FIRST + 160),

        LVM_HASGROUP = (LVM_FIRST + 161),

        LVM_SETTILEVIEWINFO = (LVM_FIRST + 162),

        LVM_GETTILEVIEWINFO = (LVM_FIRST + 163),

        LVM_SETTILEINFO = (LVM_FIRST + 164),

        LVM_GETTILEINFO = (LVM_FIRST + 165),

        LVM_SETINSERTMARK = (LVM_FIRST + 166),

        LVM_GETINSERTMARK = (LVM_FIRST + 167),

        LVM_INSERTMARKHITTEST = (LVM_FIRST + 168),

        LVM_GETINSERTMARKRECT = (LVM_FIRST + 169),

        LVM_SETINSERTMARKCOLOR = (LVM_FIRST + 170),

        LVM_GETINSERTMARKCOLOR = (LVM_FIRST + 171),

        LVM_SETINFOTIP = (LVM_FIRST + 173),

        LVM_GETSELECTEDCOLUMN = (LVM_FIRST + 174),

        LVM_ISGROUPVIEWENABLED = (LVM_FIRST + 175),

        LVM_GETOUTLINECOLOR = (LVM_FIRST + 176),

        LVM_SETOUTLINECOLOR = (LVM_FIRST + 177),

        LVM_CANCELEDITLABEL = (LVM_FIRST + 179),

        LVM_MAPINDEXTOID = (LVM_FIRST + 180),

        LVM_MAPIDTOINDEX = (LVM_FIRST + 181),

        TVM_INSERTITEMA = (TV_FIRST + 0),

        TVM_INSERTITEMW = (TV_FIRST + 50),

        TVM_DELETEITEM = (TV_FIRST + 1),

        TVM_EXPAND = (TV_FIRST + 2),

        TVM_GETITEMRECT = (TV_FIRST + 4),

        TVM_GETCOUNT = (TV_FIRST + 5),

        TVM_GETINDENT = (TV_FIRST + 6),

        TVM_SETINDENT = (TV_FIRST + 7),

        TVM_GETIMAGELIST = (TV_FIRST + 8),

        TVM_SETIMAGELIST = (TV_FIRST + 9),

        TVM_GETNEXTITEM = (TV_FIRST + 10),

        TVM_SELECTITEM = (TV_FIRST + 11),

        TVM_GETITEMA = (TV_FIRST + 12),

        TVM_GETITEMW = (TV_FIRST + 62),

        TVM_SETITEMA = (TV_FIRST + 13),

        TVM_SETITEMW = (TV_FIRST + 63),

        TVM_EDITLABELA = (TV_FIRST + 14),

        TVM_EDITLABELW = (TV_FIRST + 65),

        TVM_GETEDITCONTROL = (TV_FIRST + 15),

        TVM_GETVISIBLECOUNT = (TV_FIRST + 16),

        TVM_HITTEST = (TV_FIRST + 17),

        TVM_CREATEDRAGIMAGE = (TV_FIRST + 18),

        TVM_SORTCHILDREN = (TV_FIRST + 19),

        TVM_ENSUREVISIBLE = (TV_FIRST + 20),

        TVM_SORTCHILDRENCB = (TV_FIRST + 21),

        TVM_ENDEDITLABELNOW = (TV_FIRST + 22),

        TVM_GETISEARCHSTRINGA = (TV_FIRST + 23),

        TVM_GETISEARCHSTRINGW = (TV_FIRST + 64),

        TVM_SETTOOLTIPS = (TV_FIRST + 24),

        TVM_GETTOOLTIPS = (TV_FIRST + 25),

        TVM_SETINSERTMARK = (TV_FIRST + 26),

        TVM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,

        TVM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,

        TVM_SETITEMHEIGHT = (TV_FIRST + 27),

        TVM_GETITEMHEIGHT = (TV_FIRST + 28),

        TVM_SETBKCOLOR = (TV_FIRST + 29),

        TVM_SETTEXTCOLOR = (TV_FIRST + 30),

        TVM_GETBKCOLOR = (TV_FIRST + 31),

        TVM_GETTEXTCOLOR = (TV_FIRST + 32),

        TVM_SETSCROLLTIME = (TV_FIRST + 33),

        TVM_GETSCROLLTIME = (TV_FIRST + 34),

        TVM_SETINSERTMARKCOLOR = (TV_FIRST + 37),

        TVM_GETINSERTMARKCOLOR = (TV_FIRST + 38),

        TVM_GETITEMSTATE = (TV_FIRST + 39),

        TVM_SETLINECOLOR = (TV_FIRST + 40),

        TVM_GETLINECOLOR = (TV_FIRST + 41),

        TVM_MAPACCIDTOHTREEITEM = (TV_FIRST + 42),

        TVM_MAPHTREEITEMTOACCID = (TV_FIRST + 43),

        CBEM_INSERTITEMA = (WM_USER + 1),

        CBEM_SETIMAGELIST = (WM_USER + 2),

        CBEM_GETIMAGELIST = (WM_USER + 3),

        CBEM_GETITEMA = (WM_USER + 4),

        CBEM_SETITEMA = (WM_USER + 5),

        CBEM_DELETEITEM = CB_DELETESTRING,

        CBEM_GETCOMBOCONTROL = (WM_USER + 6),

        CBEM_GETEDITCONTROL = (WM_USER + 7),

        CBEM_SETEXTENDEDSTYLE = (WM_USER + 14),

        CBEM_GETEXTENDEDSTYLE = (WM_USER + 9),

        CBEM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,

        CBEM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,

        CBEM_SETEXSTYLE = (WM_USER + 8),

        CBEM_GETEXSTYLE = (WM_USER + 9),

        CBEM_HASEDITCHANGED = (WM_USER + 10),

        CBEM_INSERTITEMW = (WM_USER + 11),

        CBEM_SETITEMW = (WM_USER + 12),

        CBEM_GETITEMW = (WM_USER + 13),

        TCM_GETIMAGELIST = (TCM_FIRST + 2),

        TCM_SETIMAGELIST = (TCM_FIRST + 3),

        TCM_GETITEMCOUNT = (TCM_FIRST + 4),

        TCM_GETITEMA = (TCM_FIRST + 5),

        TCM_GETITEMW = (TCM_FIRST + 60),

        TCM_SETITEMA = (TCM_FIRST + 6),

        TCM_SETITEMW = (TCM_FIRST + 61),

        TCM_INSERTITEMA = (TCM_FIRST + 7),

        TCM_INSERTITEMW = (TCM_FIRST + 62),

        TCM_DELETEITEM = (TCM_FIRST + 8),

        TCM_DELETEALLITEMS = (TCM_FIRST + 9),

        TCM_GETITEMRECT = (TCM_FIRST + 10),

        TCM_GETCURSEL = (TCM_FIRST + 11),

        TCM_SETCURSEL = (TCM_FIRST + 12),

        TCM_HITTEST = (TCM_FIRST + 13),

        TCM_SETITEMEXTRA = (TCM_FIRST + 14),

        TCM_ADJUSTRECT = (TCM_FIRST + 40),

        TCM_SETITEMSIZE = (TCM_FIRST + 41),

        TCM_REMOVEIMAGE = (TCM_FIRST + 42),

        TCM_SETPADDING = (TCM_FIRST + 43),

        TCM_GETROWCOUNT = (TCM_FIRST + 44),

        TCM_GETTOOLTIPS = (TCM_FIRST + 45),

        TCM_SETTOOLTIPS = (TCM_FIRST + 46),

        TCM_GETCURFOCUS = (TCM_FIRST + 47),

        TCM_SETCURFOCUS = (TCM_FIRST + 48),

        TCM_SETMINTABWIDTH = (TCM_FIRST + 49),

        TCM_DESELECTALL = (TCM_FIRST + 50),

        TCM_HIGHLIGHTITEM = (TCM_FIRST + 51),

        TCM_SETEXTENDEDSTYLE = (TCM_FIRST + 52),

        TCM_GETEXTENDEDSTYLE = (TCM_FIRST + 53),

        TCM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,

        TCM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,

        ACM_OPENA = (WM_USER+100),

        ACM_OPENW = (WM_USER+103),

        ACM_PLAY = (WM_USER+101),

        ACM_STOP = (WM_USER+102),

        MCM_FIRST = 0x1000,

        MCM_GETCURSEL = (MCM_FIRST + 1),

        MCM_SETCURSEL = (MCM_FIRST + 2),

        MCM_GETMAXSELCOUNT = (MCM_FIRST + 3),

        MCM_SETMAXSELCOUNT = (MCM_FIRST + 4),

        MCM_GETSELRANGE = (MCM_FIRST + 5),

        MCM_SETSELRANGE = (MCM_FIRST + 6),

        MCM_GETMONTHRANGE = (MCM_FIRST + 7),

        MCM_SETDAYSTATE = (MCM_FIRST + 8),

        MCM_GETMINREQRECT = (MCM_FIRST + 9),

        MCM_SETCOLOR = (MCM_FIRST + 10),

        MCM_GETCOLOR = (MCM_FIRST + 11),

        MCM_SETTODAY = (MCM_FIRST + 12),

        MCM_GETTODAY = (MCM_FIRST + 13),

        MCM_HITTEST = (MCM_FIRST + 14),

        MCM_SETFIRSTDAYOFWEEK = (MCM_FIRST + 15),

        MCM_GETFIRSTDAYOFWEEK = (MCM_FIRST + 16),

        MCM_GETRANGE = (MCM_FIRST + 17),

        MCM_SETRANGE = (MCM_FIRST + 18),

        MCM_GETMONTHDELTA = (MCM_FIRST + 19),

        MCM_SETMONTHDELTA = (MCM_FIRST + 20),

        MCM_GETMAXTODAYWIDTH = (MCM_FIRST + 21),

        MCM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,

        MCM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,

        DTM_FIRST = 0x1000,

        DTM_GETSYSTEMTIME = (DTM_FIRST + 1),

        DTM_SETSYSTEMTIME = (DTM_FIRST + 2),

        DTM_GETRANGE = (DTM_FIRST + 3),

        DTM_SETRANGE = (DTM_FIRST + 4),

        DTM_SETFORMATA = (DTM_FIRST + 5),

        DTM_SETFORMATW = (DTM_FIRST + 50),

        DTM_SETMCCOLOR = (DTM_FIRST + 6),

        DTM_GETMCCOLOR = (DTM_FIRST + 7),

        DTM_GETMONTHCAL = (DTM_FIRST + 8),

        DTM_SETMCFONT = (DTM_FIRST + 9),

        DTM_GETMCFONT = (DTM_FIRST + 10),

        PGM_SETCHILD = (PGM_FIRST + 1),

        PGM_RECALCSIZE = (PGM_FIRST + 2),

        PGM_FORWARDMOUSE = (PGM_FIRST + 3),

        PGM_SETBKCOLOR = (PGM_FIRST + 4),

        PGM_GETBKCOLOR = (PGM_FIRST + 5),

        PGM_SETBORDER = (PGM_FIRST + 6),

        PGM_GETBORDER = (PGM_FIRST + 7),

        PGM_SETPOS = (PGM_FIRST + 8),

        PGM_GETPOS = (PGM_FIRST + 9),

        PGM_SETBUTTONSIZE = (PGM_FIRST + 10),

        PGM_GETBUTTONSIZE = (PGM_FIRST + 11),

        PGM_GETBUTTONSTATE = (PGM_FIRST + 12),

        PGM_GETDROPTARGET = CCM_GETDROPTARGET,

        BCM_GETIDEALSIZE = (BCM_FIRST + 0x0001),

        BCM_SETIMAGELIST = (BCM_FIRST + 0x0002),

        BCM_GETIMAGELIST = (BCM_FIRST + 0x0003),

        BCM_SETTEXTMARGIN = (BCM_FIRST + 0x0004),

        BCM_GETTEXTMARGIN = (BCM_FIRST + 0x0005),

        EM_SETCUEBANNER     = (ECM_FIRST + 1),

        EM_GETCUEBANNER     = (ECM_FIRST + 2),

        EM_SHOWBALLOONTIP = (ECM_FIRST + 3),

        EM_HIDEBALLOONTIP = (ECM_FIRST + 4),

        CB_SETMINVISIBLE = (CBM_FIRST + 1),

        CB_GETMINVISIBLE = (CBM_FIRST + 2),

        LM_HITTEST = (WM_USER + 0x300),

        LM_GETIDEALHEIGHT = (WM_USER + 0x301),

        LM_SETITEM = (WM_USER + 0x302),

        LM_GETITEM = (WM_USER + 0x303)

Posted by 나비:D
:
출처 : http://blog.powerumc.kr/article/2008/03/09/MSI-Deploy-Vista.aspx
Written By 엄준일(땡초)
비스타에서 설치 프로젝트 권한상승 하기
 
비스타가 출시되면서 화려해진 인터페이스 만큼 수많은 부분에서 이슈가 생겼습니다. 게임/시스템/개발 등의 대체로 전반적인 부분에서 사용자들의 따가운 질타를 받아왔습니다.
 
그 중에서 배포 프로젝트와 관련하여 알아보았던 설치 프로젝트의 권한 상승 문제는 Visual Studio 2008 의 설치 프로젝트의 권한 상승 기능을 이용하여 해결할 수 있었습니다. 하지만 Windows Installer 에 의한 MSI 설치 파일을 약간 다른 방법으로 해결해야 합니다.
 
 
Windows Installer 에 의한 MSI 설치 파일 권한 상승 방법
 
Windows Installer 는 msiexec 에 의해 설치파일(.MSI) 설치 환경을 제공해 줍니다. 때문에 근본적으로 MSI 설치 파일의 관리자 권한을 획득하기 위해서는…
 
1.     비스타의 UAC 기능을 제거하는 방법입니다.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 의 EnableLUA 키값을 변경하여 UAC 기능을 허용/제거 할 수 있습니다. ( 1은 UAC On/ 0은
UAC Off)

2.     Msiexec.exe 를 관리자 권한으로 실행하는 것이 가장 손쉽게 관리자 권한을 얻는 방법일 것입니다. Msiexec.exe 에 의해 MSI 설치 파일이 호스팅 된다는 것을 생각해 본다면 아마도 당연한 방법일 것입니다.

3.     지난번에 말씀드렸던 Orca Tool 을 이용하여 MSI 파일의 스크립트를 조작하는 방법입니다. 하지만, 빌드 후에 매번 Orca Tool 로 스크립트를 조작하기엔 너무나도 번거롭고 불편합니다.
하지만, 이 툴을 이용하여 빌드 단계를 거치지 않고, 설치 프로젝트의 제목이나 설치 경로 등의 스크립트를 조작할 수 있기 때문에, 가끔씩 매우 유용하게 사용할 수 있습니다
.

 
하지만, 강제로 사용자의 UAC 기능을 제거하는 방법은 그다지 좋은 방법이 아니고. 또한, 나머지 방법들도 효율적이지 않습니다.
 
 
빌드 이벤트를 이용한 MSI 설치 파일 권한 상승 하기
 
우선 Windows Installer Development Kit 을 다운로드 받도록 합니다. 제법 용량이 크고, 설치도 오래 걸립니다. 이 Kit 의 WiRunSql.vbs 파일이 필요한데, 이 파일만 구할 수 있다면 굳이 Windows Installer Development Kit 전체를 받을 필요는 없을 것 같네요.
 
1.     WiRunSql.vbs 파일을 설치 프로젝트 폴더에 복사합니다.
2.     속성 창에 PostBuildEvent 을 찾아 다음의 스크립트를 삽입합니다.
( 참고 : 빌드 이벤트는 여기 아티클에서 다루었습니다 )



cscript //nologo "$(ProjectDir)WiRunSql.vbs" "$(BuiltOuputPath)" "UPDATE CustomAction SET CustomAction.Type=3073 WHERE CustomAction.Type=1025 AND CustomAction.Source='InstallUtil' AND CustomAction.Target='ManagedInstall'"
 
cscript //nologo "$(ProjectDir)WiRunSql.vbs" "$(BuiltOuputPath)" "UPDATE CustomAction SET CustomAction.Type=3585 WHERE CustomAction.Type=1537 AND CustomAction.Source='InstallUtil' AND CustomAction.Target='ManagedInstall'"

Orca Tool 로 MSI 프로젝트 내부를 한번이라도 보셨다면 저 희한한 문장이 무엇을 의미 하는지는 아실 것 같습니다.
 
위와 같이 간단하게 Windows Installer Development Kit 의 vbs 스크립트를 이용하여 MSI 설치 파일의 비스타 권한 상승 효과를 얻을 수 있습니다. 단, MSI 설치 파일 실행 시 관리자 권한 상승 창이 뜨는 것은 아니고, 실제 설치 중 ProgressBar 가 나타나게 되면, 권한 상승 창이 뜨게 됩니다.
 
 
너무 쉬었네… ㅠ.ㅠ
 
그 동안 너무 쉬었던 탓에, 블로그 글 쓰는 것이 너무너무 버겁습니다;; 이거 써놓고, 또 한 달을 띵가띵가 쉴 지 모르죠 ㅋ;;; 아무튼 이번 달에 Silverlight 2.0 Beta 출시를 시작으로 많은 MS 의 신제품이 출시가 되네요. 정말 기대가 많습니다.
Posted by 나비:D
:

출처 : http://www.dalbong2.net/46

프로덕트 XML 파일


부트스트래퍼(Bootstrapper)는 ClickOnce 애플리케이션이 구동되기 전에 애플리케이션에서 필요로 하는 필수 프로그램(prerequisties)이 먼저 설치되어 있는지를 확인하는 작은 부피의 프로그램을 말한다. Visual Studio.NET 2005에는 내장된 부트스트래퍼 기능이 있다. 우리는 이 기능을 사용하여 ClickOnce 애플리케이션이 실행되기전에 필요한 다른 컴포넌트를 설치할 수 있다.
달봉이는 지금까지 알고 있는 방법중에서 이전의 COM 컴포넌트나 .NET 어셈블리나 가리지 않고 클라이언트로 배포를 할 수 있는 가장 쉬운 방법중의 하나로 여기고 있다. 단점은 ClickOnce에서만 가능하다는 것이다.[현재 2006.09.16]

VS.NET의 부트스트래퍼 기능을 사용하기 위해서는 우선 컴포넌트를 설치하는 설치 프로그램(.exe or .msi)을 작성해야 한다. 그런 다음 이 설치 프로그램을 부트스트래퍼에 등록해야 한다. 그러기 위해서는  XML형식의 프로덕트 파일(product file)을 제작해야 한다.  

프로덕트 파일
(파일을 클릭하면 선명한 그림이 뜹니다)

프로덕트 파일은 ClickOnce 프로그램이 실행되기 전에, 어떤 필수 프로그램들이 설치되어 있어야 하는지를 설명해주는 부트스트래퍼용 manifest 파일을 생성해준다. 프로덕트 파일에는 ClickOnce 애플리케이션이 필요로하는 필수 컴포넌트들을  설치하는 설치프로그램들에 대한 정보를 여러개 포함시킬 수 있다.
이 그림처럼 프로덕트 파일을 생성해서 설치 프로그램과 같이 적절한 위치에 두면  ( 달봉의 경로는 다음과 같다. C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages ) 아래 그림처럼 VS.NET의 게시 디자이너에서 필수 구성 요소 버튼을 클릭했을때 선택할 수 있는 박스에 나타나게 된다. 이제 필요한 프로그램을 선택해서 게시를 하면 된다.

VS.NET에서 필수 구성 요소 선택
(파일을 클릭하면 선명한 그림이 뜹니다)

이제 이 프로덕트 XML 파일을 제작하는 방법을 알아본다.

프로덕트 파일 제작

프로덕트 파일을 제작하기 위해서는 부트스트래퍼가 이해할 수 있는 규칙에 맞도록 작성해야 한다. 이런 XML 스키마는 다음 링크에서 찾아볼 수 있다.
Product and Package Schema Reference - msdn
http://msdn2.microsoft.com/en-us/library/ms229223.aspx(새 창으로 열기)

그렇지만 이 스키마를 이해하고 직접 손으로 작성하라고 하면 MS에 짜증이 날것이다. 이런 스키마가 있다면 이런 것을 제작할 수 있는 편집기도 주면 좋잖은가. 근데 아직 공식적으로 출시된 유틸 프로그램은 없는 것으로 안다. 다행히도 이 XML 파일을 생성해주는 편집 툴을 제공하는 훌륭한 분이 계시다.

프로덕트 파일 생성 툴
ClickOnce Bootstrapper Manifest Generator

자세한 내용은 Powertoys blog(새 창으로 열기)에서 볼 수 있다.

이제 이 툴을 사용하는 방법을 소개한다. 툴을 실행시키고 File->New를 선택한다.

(파일을 클릭하면 선명한 그림이 뜹니다)

Package Manifest 프로젝트 타입을 선택한다.

(파일을 클릭하면 선명한 그림이 뜹니다)

(파일을 클릭하면 선명한 그림이 뜹니다)

그림처럼 package 노드가 하나 기본적으로 생성되면 적절하게 package 이름을 입력한다. 이 이름은 C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages 아래에 생성되는 폴더명이 될 것이다.

(파일을 클릭하면 선명한 그림이 뜹니다)

그런 다음 위 그림처럼 "Add Install File" 버튼을 클릭하면 아래처럼 설치파일을 추가할 수 있는 창이 뜬다.


적절한 설치파일을 검색해서 선택한다. 이 설치 파일은 ClickOnce 애플리케이션이 실행되기 전에 미리 설치되어 있어야 하는 컴포넌트를 클라이언트 PC에 설치하게 될 것이다. 달봉이는 임시로 iis60rkt.exe라는 파일을 선택하고 있다. ClickOnce 애플리케이션과는 전혀 상관없는 셋업 파일이긴 하지만.

(파일을 클릭하면 선명한 그림이 뜹니다)

그런 다음 적절한 display 명을 준다. 이 이름은 VS.NET의 필수 구성요소 선택하는 창에 출력될 것이다.

(파일을 클릭하면 선명한 그림이 뜹니다)

그런 다음 System Checks 탭을 선택한다. 이 탭에서는 이 컴포넌트가 이미 설치되었는지를 체크하는 로직을 선택할 수 있다. 설치 여부를 체크하는 로직은 여러가지를 제공하고 있다. 그림의 아이콘에 커서를 올려놓으면  설치 여부를 체크하는 로직으로
"File Check",
"Registry Check",
"Registry File Check",
"MSI Product Check",
"External Check",
"Assembly GAC Check"

등이 있음을 알 수 있다. File Check라는 것은 앞의 그림처럼 "어떤 경로의 폴더에 지정한 파일이 있으면 이미 이 PC에는 원하는 셋업이 이뤄져있다"는 것으로 간주하겠다는 것이다. 레지스트리에 특정 값이 있는지를 판단해서 설치여부를 판단할 수도 있다. 시스템 체크 로직에 대한 다른 구체적인 방법에 대해서는 앞에서 알려준 MSDN 링크 페이지(새 창으로 열기)를 통해서 알아보길 바란다.
달봉이는 단순히 그림과 같은 경로에 iisTools.chm 파일이 있는지를 판단해서 그 결과값을 IIS60rktInstalled에 받아 두도록 하고 있다.

(파일을 클릭하면 선명한 그림이 뜹니다)

다음은 Install Conditions 탭을 선택한다. 이곳에서는 System Checks 탭에서 시스템의 상태를 체크한 값을 이용해서 값에 따라서 어떻게 할 것인지를 설정할 수 있다. 그림은 앞에서 설정된 IIS60rktInstalled 값이 0보다 크거나 같으면 그냥 설치를 통과하도록 설정하고 있다. IIS60rktInstalled 같은 변수에 어떤 값이 저장될 지는 시스템 체크 로직에 따라 다르다. 이런 구체적인 값도 앞에서 알려준 msdn 링크(새 창으로 열기)를 참조하기 바란다.

(파일을 클릭하면 선명한 그림이 뜹니다)

다음은 Exit Codes 탭을 선택한다. 설치 파일이 exit code를 리턴하고 그것에 따라 실패, 성공, 재부팅들을 설정해줄 수가 있다. 달봉은 exit code에 대한 설정을 해 주지 않고 있다. 다만 아래 부분을 보면 "Use Default System Exit Codes"가 선택되어 있고 결과값으로 Fail이 선택되어 있는데, 이것은 설치 후 상태를 기본적으로 설치 실패로 설정하겠다는 것이다. 우리는 이것의 체크를 없애 줘야 한다.  

(파일을 클릭하면 선명한 그림이 뜹니다)

그런 다음 저장 버튼을 클릭하면 지금까지 설정한 내용을 저장할 수 있다. 이때 저장된 내용은 우리가 원하는 xml 형식의 프로덕트 파일은 아니다. 이렇게 저장된 내용은 언제든지 다시 불러와서 재 편집을 할 수 있다(근데, 이 기능이 아직은 제대로 작동하지 않는듯하다)

(파일을 클릭하면 선명한 그림이 뜹니다)

우리가 원하는 xml의 프로덕트 파일을 최종적으로 만들어 내기 위해서는 위 그림처럼 "Project->Build" 메뉴를 선택해야 한다. 이 메뉴를 선택하고 나면 아래 그림처럼 결과가 나타난다.

(파일을 클릭하면 선명한 그림이 뜹니다)

이 그림은 최종적으로 프로덕트 파일이 저장된 경로(기본적으로 C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages )와 프로덕트 파일을 생성하는과정에 남긴 로그를 보여주고 있다. 프로덕트 파일의 저장 경로는 "Project->Properties"에서 변경할 수 있다.

이렇게 해서 최종적인 프로덕트 파일이 생성되었고 적절한 폴더에 위치시켰다. 이제 VS.NET을 실행시키고 게시 디자이너를 통해서 필요한 설치 프로그램을 선택한 후 게시를 하면 된다.

--------------------------------------------------------------------------------

참조 문서

Product and Package Schema Reference - msdn
http://msdn2.microsoft.com/en-us/library/ms229223.aspx(새 창으로 열기)
ClickOnce Deployment Technology - Peter Bromberg
http://www.wise.com/Library/ClickOnce.pdf(새 창으로 열기)
ClickOnce : Bringing Ease and Reliability to SmartClient Deployment
http://www.code-magazine.com/article.aspx?quickid=0601041&page=1(새 창으로 열기)
msdn : Deploying applications
http://msdn2.microsoft.com/en-us/library/6hbb4k3e(VS.80).aspx(새 창으로 열기)

Posted by 나비:D
:
메시지 필터를 이용하여 F1, F2, F3 .. 키 입력을 후킹하기.
 
 
public class MessageFilter : System.Windows.Forms.IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        switch(m.Msg)
        {
            case 256 : // WM_KEYDOWN    
 
<==== windows message 를 C# 형태로 쓰고 싶었지만..
딱히 만들어져있는게 없더군요 그래서 인터넷에서 windows.h 파일을 검색해서 찾았습니다. WM_KETDOWN = 256 번이더군요.
 
                System.Console.WirteLine(m.LParam.ToInt32());      
                // 이걸로 F1 부터 여러가지 키를 차례데로 눌러본 값들이
                if( m.LParam.ToInt32() == 3866625 ) // F1 Key            
                // <===  이 값들입니다. 3866625 가 F1 이군요.. 이런식으로 Key 값을 찾아서
                {                                                                            
                // 계속 추가하면 키보드 후킹.. 그다지 어려운건 아닐거 같군요 ^^;;
                    System.Console.WriteLine("F1 Press");
                    return true;
                }
                else if( m.LParam.ToInt32() == 3932161 )    // F2 Key
                {
                    System.Console.WriteLine("F2 Press");
                    return true;
                }
                else if( m.LParam.ToInt32() == 3997697 )    // F3 Key
                {
                    System.Console.WriteLine("F3 Press");
                    return true;
                }
                break;
        }
        return false;
    }
}
 
//
//     만들어 놓은 MessageFilter 는 반드시 AddMessageFilter 메서드를 통해 추가해줘야 합니다.
//    static void Main 함수는 기본 Form 에 포함되어 있습니다.  :) 아시죠?
 
static void Main()
{
    Application.AddMessageFilter(new MessageFilter());
    Application.Run(new JapExamples());
}
 
 
아래 있는 것은 windows.h 파일에 정의된 windos message 들입니다. windows.h 파일은 visual studio 안에 INCLUDE_ROOT 에 있습니다.
어딘지는 아시죠?
 
 
WA_ACTIVE 1
WA_CLICKACTIVE 2
WA_INACTIVE 0
WM_ACTIVATE 6
WM_ACTIVATEAPP 28
WM_AFXFIRST 864
WM_AFXLAST 895
WM_APP 32768
WM_ASKCBFORMATNAME 780
WM_CANCELJOURNAL 75
WM_CANCELMODE 31
WM_CAPTURECHANGED 533
WM_CHANGECBCHAIN 781
WM_CHAR 258
WM_CHARTOITEM 47
WM_CHILDACTIVATE 34
WM_CLEAR 771
WM_CLOSE 16
WM_COMMAND 273
WM_COMMNOTIFY 68
WM_COMPACTING 65
WM_COMPAREITEM 57
WM_CONTEXTMENU 123
WM_COPY 769
WM_COPYDATA 74
WM_CREATE 1
WM_CTLCOLORBTN 309
WM_CTLCOLORDLG 310
WM_CTLCOLOREDIT 307
WM_CTLCOLORLISTBOX 308
WM_CTLCOLORMSGBOX 306
WM_CTLCOLORSCROLLBAR 311
WM_CTLCOLORSTATIC 312
WM_CUT 768
WM_DEADCHAR 259
WM_DELETEITEM 45
WM_DESTROY 2
WM_DESTROYCLIPBOARD 775
WM_DEVICECHANGE 537
WM_DEVMODECHANGE 27
WM_DISPLAYCHANGE 126
WM_DRAWCLIPBOARD 776
WM_DRAWITEM 43
WM_DROPFILES 563
WM_ENABLE 10
WM_ENDSESSION 22
WM_ENTERIDLE 289
WM_ENTERMENULOOP 529
WM_ENTERSIZEMOVE 561
WM_ERASEBKGND 20
WM_EXITMENULOOP 530
WM_EXITSIZEMOVE 562
WM_FONTCHANGE 29
WM_GETDLGCODE 135
WM_GETFONT 49
WM_GETHOTKEY 51
WM_GETICON 127
WM_GETMINMAXINFO 36
WM_GETOBJECT 61
WM_GETTEXT 13
WM_GETTEXTLENGTH 14
WM_HANDHELDFIRST 856
WM_HANDHELDLAST 863
WM_HELP 83
WM_HOTKEY 786
WM_HSCROLL 276
WM_HSCROLLCLIPBOARD 782
WM_ICONERASEBKGND 39
WM_IME_CHAR 646
WM_IME_COMPOSITION 271
WM_IME_COMPOSITIONFULL 644
WM_IME_CONTROL 643
WM_IME_ENDCOMPOSITION 270
WM_IME_KEYDOWN 656
WM_IME_KEYLAST 271
WM_IME_KEYUP 657
WM_IME_NOTIFY 642
WM_IME_REQUEST 648
WM_IME_SELECT 645
WM_IME_SETCONTEXT 641
WM_IME_STARTCOMPOSITION 269
WM_INITDIALOG 272
WM_INITMENU 278
WM_INITMENUPOPUP 279
WM_INPUTLANGCHANGE 81
WM_INPUTLANGCHANGEREQUEST 80
WM_KEYDOWN 256
WM_KEYFIRST 256
WM_KEYLAST 264
WM_KEYUP 257
WM_KILLFOCUS 8
WM_LBUTTONDBLCLK 515
WM_LBUTTONDOWN 513
WM_LBUTTONUP 514
WM_MBUTTONDBLCLK 521
WM_MBUTTONDOWN 519
WM_MBUTTONUP 520
WM_MDIACTIVATE 546
WM_MDICASCADE 551
WM_MDICREATE 544
WM_MDIDESTROY 545
WM_MDIGETACTIVE 553
WM_MDIICONARRANGE 552
WM_MDIMAXIMIZE 549
WM_MDINEXT 548
WM_MDIREFRESHMENU 564
WM_MDIRESTORE 547
WM_MDISETMENU 560
WM_MDITILE 550
WM_MEASUREITEM 44
WM_MENUCHAR 288
WM_MENUCOMMAND 294
WM_MENUDRAG 291
WM_MENUGETOBJECT 292
WM_MENURBUTTONUP 290
WM_MENUSELECT 287
WM_MOUSEACTIVATE 33
WM_MOUSEFIRST 512
WM_MOUSEHOVER 673
WM_MOUSELEAVE 675
WM_MOUSEMOVE 512
WM_MOUSEWHEEL 522
WM_MOVE 3
WM_MOVING 534
WM_NCACTIVATE 134
WM_NCCALCSIZE 131
WM_NCCREATE 129
WM_NCDESTROY 130
WM_NCHITTEST 132
WM_NCLBUTTONDBLCLK 163
WM_NCLBUTTONDOWN 161
WM_NCLBUTTONUP 162
WM_NCMBUTTONDBLCLK 169
WM_NCMBUTTONDOWN 167
WM_NCMBUTTONUP 168
WM_NCMOUSEMOVE 160
WM_NCPAINT 133
WM_NCRBUTTONDBLCLK 166
WM_NCRBUTTONDOWN 164
WM_NCRBUTTONUP 165
WM_NEXTDLGCTL 40
WM_NEXTMENU 531
WM_NOTIFY 78
WM_NOTIFYFORMAT 85
WM_NULL 0
WM_PAINT 15
WM_PAINTCLIPBOARD 777
WM_PAINTICON 38
WM_PALETTECHANGED 785
WM_PALETTEISCHANGING 784
WM_PARENTNOTIFY 528
WM_PASTE 770
WM_PENWINFIRST 896
WM_PENWINLAST 911
WM_POWER 72
WM_POWERBROADCAST 536
WM_PRINT 791
WM_PRINTCLIENT 792
WM_QUERYDRAGICON 55
WM_QUERYENDSESSION 17
WM_QUERYNEWPALETTE 783
WM_QUERYOPEN 19
WM_QUEUESYNC 35
WM_QUIT 18
WM_RBUTTONDBLCLK 518
WM_RBUTTONDOWN 516
WM_RBUTTONUP 517
WM_RENDERALLFORMATS 774
WM_RENDERFORMAT 773
WM_SETCURSOR 32
WM_SETFOCUS 7
WM_SETFONT 48
WM_SETHOTKEY 50
WM_SETICON 128
WM_SETREDRAW 11
WM_SETTEXT 12
WM_SETTINGCHANGE 26
WM_SHOWWINDOW 24
WM_SIZE 5
WM_SIZECLIPBOARD 779
WM_SIZING 532
WM_SPOOLERSTATUS 42
WM_STYLECHANGED 125
WM_STYLECHANGING 124
WM_SYNCPAINT 136
WM_SYSCHAR 262
WM_SYSCOLORCHANGE 21
WM_SYSCOMMAND 274
WM_SYSDEADCHAR 263
WM_SYSKEYDOWN 260
WM_SYSKEYUP 261
WM_TCARD 82
WM_TIMECHANGE 30
WM_TIMER 275
WM_UNDO 772
WM_UNINITMENUPOPUP 293
WM_USER 1024
WM_USERCHANGED 84
WM_VKEYTOITEM 46
WM_VSCROLL 277
WM_VSCROLLCLIPBOARD 778
WM_WINDOWPOSCHANGED 71
WM_WINDOWPOSCHANGING 70
WM_WININICHANGE 26

출처 : 데브피아

Posted by 나비:D
:
 

안녕하세요. 굿띠입니다...

 이번 포스트는 Property에 대해 얘기를 해보고 활용방법에 대해 간단하게 정리를 해볼까 합니다... 이것도 팁이 될수 있을까 모르겠네요..^^

Property는 어떤 구조로 되어 있다는거는 누구나 다 아실 겁니다.. 하지만 어떤 property를 얘기하는거지??? 라고 말하시는 분도 있을수도 있기 때문에 한번 다음과 같이 간단하게 소스를 만들어보도록 하겠습니다.


  class TestProperty
  {
    private string m_Test;

    public string Test
    {
      get
      {
        return m_Test;
      }
      set
      {
        m_Test = value;
      }
    }

    public TestProperty()
    {
    }
  }


 아~ 이것은 프로그램 하신 분이라면 누구나 많이 보던 소스아닙니까??? 그쵸??^^ 그럼 제가 한번 정리 해보겠습니다.

일반적으로 필드가 public이면 다른 개체가 해당 필드에 직접 액세스가 가능하고 수정 할 수 있지만 위와 같은 Property는 다른 개체를 통해 수정할수는 있으나 해당 필드를 소유하는 개체에 접근하지 못 하도록 합니다. 그리고 필드의 전용값을 읽고 쓰고 융통성 있는 메커니즘을 제공하는 멤버입니다. 이 Property는 멤버변수 처럼 사용할 수 있지만 실제로는 접근자를 통해 구현이 가능 한것이죠! 접근자는 위의 소스내용을 보시면 get, set을 생성하여 private 데이터에 엑세스 한다는것을 보실수 있습니다.


하지만 여기서 Property와 필드의 명확한 구분이 필요할 것 같습니다. 이 Property와 필드는 모두 개체에 정보를 저장하고 검색합니다. 이런 두개의 속성과 필드 기능의 유사성으로 인해 다음과 같은 경우에 서로 구분하여 프로그래밍 방식을 결정합니다. 다음 내용은 MSDN의 한 부분을 발췌했습니다.


다음 경우는 Perperty를 사용합니다.

  • 값이 설정되고 검색되는 시기와 방법을 제어해야 하는 경우

  • 속성에 유효성을 검사해야 하는 잘 정의된 값 집합이 들어 있는 경우

  • IsVisible 속성처럼 값을 설정했을 때 개체의 상태가 크게 변경되는 경우

  • 속성을 설정했을 때 다른 내부 변수나 다른 속성의 값으로 변경되는 경우

  • 속성을 설정하거나 검색하기 전에 일련의 작업 단계를 수행해야 하는 경우


    다음 경우에 필드를 사용합니다.

  • 값이 자체적으로 유효성을 검사하는 형식인 경우. 예를 들어, Boolean 변수에 True 또는 False 이외의 값이 할당되면 오류가 발생하거나 자동 데이터 변환이 수행됩니다.

  • 데이터 형식에서 지원하는 범위의 값이 유효한 경우. Single 또는 Double 형식의 여러 속성에도 적용됩니다.

  • 속성이 String 데이터 형식이고 문자열의 크기나 값에 대해 제약 조건이 없는 경우

     

    링크 : http://msdn2.microsoft.com/ko-kr/library/9d65as2e(VS.80).aspx




    다음으로 Property의 접근자에 대해서 한번 알아보도록 합시다. get 접근자는 속성 값을 반환하는 데 사용되고, set 접근자는 데이터를 저장할때 사용합니다. 여기서 get접근자는 방금 말씀드렸다시피 Property를 정의할때도 사용되지만 인덱서 요소를 검색하고 정의할때 사용되기도 합니다. 인덱서의 자세한 내용은 여기를 참조하시면 될거 같습니다.^^ http://msdn2.microsoft.com/ko-kr/library/6x16t2tx(VS.80).aspx

     

     

     

    활용 : Property를 활용하여 TextBox의 DataBindings속성을 구현하자(따라하기)

     

    그럼 한번 Property를 이용하여 TextBox컨트롤과 데이타바인딩을 한번 시켜보겟습니다. Control.DataBindings속성은 필드의 데이터와는 바인딩이 되지 않지만 Property와는 데이터 바인딩이 가능하기 때문에 코드의 가독성과 효율적인 프로그래밍을 할 수 있습니다.



    1. 먼저 응용프로그램 프로젝트를 하나 만듭니다. 이름은 TextDataBinding으로 합니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    2. 다음 폼디자인 화면에서 다음과 같이 컨트롤을 배치합니다. 이름의 텍스트 박스 컨트롤의 네임은 txt_name, 나이의 텍스트 박스 컨트롤의 네임은 txt_age로 지정합니다.




    3. 다음 두개의 텍스트박스와 데이터 바인딩 되는 Property를 만듭니다. 소스는 다음과 같습니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    4. 폼 로드 이벤트에 텍스트박스와 Property가 데이터 바인딩 될수 있도록 다음과 같이 작성합니다.

     

     

     

     

    Add메서드의 3개의 인자중 첫번째는 데이터 바인딩 되는 속성을 말합니다. 저는 텍스트 박스의 Text속성과 데이터바인딩을 하기위해 Text라고 적었습니다. 2번째 인자는 데이터 소스와 3번째 인자 데이터 멤버이므로 현재 클래스의 this와 Property이름을 넣었습니다.




    5. 버튼 컨트롤을 더블 클릭하여 Click이벤트를 등록하고 다음과 같이 작성합니다.

     

     

     

     



    그럼 전체 소스를 보여드리고 테스트를 한번 해보겠습니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    테스트를 해볼까요??? ^^ 프로그램을 실행한뒤 텍스트박스에 이름과, 나이를 입력하고 확인을 눌러봅시다.




     

     

     

     

     

     

     

     

     

     

     

     

     

    짠~~ 올바른 결과가 나왔네요...

    정리 : 버튼을 눌렀을경우 Property를 출력하라고 했습니다.  어때요??  Property는 TextBox와 데이터 바인딩이 되어 있기 때문에 Property를 통해 TextBox의 Text의 내용을 간단하게 출력할 수 있는 것입니다. 더 이상 정리는 필요 없을 것 같군요..

     

    한번 여러분도 따라 해보세요...^^!!

     

     

     

    TIP : VS2005의 리페터링으로 Property를 쉽게 만들자!!!

    여러분은 Property를 처음부터 끝까지 입력하시는건 아니죠??? Property를 10개나 만든다고 생각해보세요. 코딩 제대로 못하고 반복되는 Ctrl + C,V를 하면서 고친다면 프로그래밍의 재미를 보기전에 흥미를 잃어버릴수도 있을 겁니다. 저도 처음에는 열심이 입력했답니다.^^

    VS2005 이상 에서는 이러한 귀찮은 작업을 쉽게 만들수 있도록 도와주는 기능이 있습니다. 바로 리펙터링이라는 기능중에 필드 캡슐화라는 기능 인데요. 사용법은 다음과 같습니다.

     

    1. 먼저 private 멤버변수를 하나 만듭니다.








     

     

    2. private 멤버변수에서 우클릭 -> 리펙터링 -> 필드 캡슐화를 선택합니다.



     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    3. 다음 아래 그림과 같이 필드 이름을 적어주고 확인을 눌러줍니다.


    4. 짜잔~~! Property가 쉽게 만들어지는걸 볼 수 있습니다.


     VS2005는 이러한 반복적인 작업을 최소화 하기 위해 여러가지의 리펙터링 기능이 존재합니다. 이러한 리팩터링 작업을 사용하면 기존 필드에서 신속하게 속성을 만든 다음 문제 없이 코드를 새 속성에 대한 참조로 구현할 수 있습니다.^^

  • Posted by 나비:D
    :

    윈도우를 종료
    System.Diagnostics.Process.Start("cmd.exe","ShutDown.exe -s -f -t 00");


    윈도우를 재부팅

    System.Diagnostics.Process.Start("cmd.exe","ShutDown.exe -r -f -t 00");

     

    특정 폴더 열기
    System.Diagnostics.Process.Start("explorer.exe", "C:\Temp");

    특정 사이트 열기
    System.Diagnostics.Process.Start("explorer.exe", "http://www.naver.com");

     

    도스명령어 실행

    System.Diagnostics.Process.Start("cmd.exe","/c dir");

    // cmd 옵션에 대해 더 알고싶으면.. c:>help cmd

     

    Process.Start 메서드 사용형식
     

    using System.Diagnostics;

    //System.Diagnostics 네임스페이스는 시스템 프로세스, 이벤트 로그 및 성능 카운터와 상호 작용할 수 있는 클래스를 제공합니다.

     

    public bool Start();
    //이 Process 구성 요소의 StartInfo 속성으로 지정된 프로세스 리소스를 시작하거나 다시 사용하여 구성 요소에 연결합니다.

     

    Process myProcess = new Process();
    string myDocumentsPath =   Environment.GetFolderPath(Environment.SpecialFolder.Personal);
    myProcess.StartInfo.FileName = myDocumentsPath + "
    \MyFile.doc";
    myProcess.StartInfo.Verb = "Print";
    myProcess.StartInfo.CreateNoWindow = true;
    myProcess.Start();

     

    public static Process Start( ProcessStartInfo startInfo);
    // ProcessStartInfo : 파일 이름 및 모든 명령줄 인수를 포함하여 프로세스를 시작하는 데 사용되는 정보
    // 시작할 프로세스의 파일 이름 같은 프로세스 시작 정보가 포함된 매개 변수에 의해 지정된
    // 프로세스 리소스를 시작하고 해당 리소스를 새 Process 구성 요소에 연결합니다

     

    ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
    startInfo.WindowStyle = ProcessWindowStyle.Minimized;
    startInfo.Arguments = "
    www.naver.com";
    Process.Start(startInfo);

     

    public static Process Start(string fileName);
    // fileName : 프로세스에서 실행될 응용 프로그램 파일 이름입니다.

    //문서 또는 응용 프로그램 파일 이름을 지정하여 프로세스 리소스를 시작하고 해당 리소스를 새 Process 구성 요소에 연결합니다

     

    Process.Start("IExplore.exe");

     

    public static Process Start(string fileName, string arguments);
    // arguments : 프로세스를 시작할 때 전달할 명령줄 인수입니다

    //응용 프로그램 이름 및 명령줄 인수 집합을 지정하여 프로세스 리소스를 시작하고 해당 리소스를 새 Process 구성 요소에 연결합니다.

     

    Process.Start("IExplore.exe", "C:\myPath\myFile.htm");
    Process.Start("IExplore.exe", "C:\myPath\myFile.asp");

     

     

    Process 클래스

    Process 구성 요소는 컴퓨터에서 실행 중인 프로세스에 대한 액세스를 제공합니다. 간단히 말해 프로세스란 실행 중인 응용 프로그램을 말합니다.

     

    Process 구성 요소는 응용 프로그램의 시작, 중지, 제어 및 모니터링을 위한 유용한 도구입니다.
    Process 구성 요소를 사용하면 실행 중인 프로세스의 목록을 얻거나 새로운 프로세스를 시작할 수 있습니다. 또한 Process 구성 요소를 사용하여 시스템 프로세스에도 액세스할 수 있습니다.
    Process 구성 요소를 초기화한 후에는 해당 구성 요소를 사용하여 실행 중인 프로세스에 대한 정보를 얻을 수 있으며 그러한 정보에는 스레드 집합, 로드된 모듈(.dll 및 .exe 파일), 프로세스가 사용하고 있는 메모리 양과 같은 성능 정보 등이 포함됩니다.

     

    프로세스 구성 요소는 속성 그룹에 대한 정보를 한 번에 가져옵니다. Process 구성 요소가 특정 그룹의 한 멤버에 대한 정보를 가져올 때 해당 그룹의 나머지 속성 값이 캐싱되므로 Refresh 메서드를 호출하지 않는 한 그룹의 다른 멤버에 대한 새로운 정보를 가져오지 않습니다. 따라서 속성 값이 Refresh 메서드를 마지막으로 호출하여 얻은 속성 값과 같을 수 있습니다. 이러한 그룹 명세는 운영 체제에 따라 다릅니다.

     

    더 자세한 사항은 Microsoft Visual Studio .NET 2003 도움말에서 Process 클래스를 참고하세요.

     

     

    도스명령수행 프로그램 


     

    [전체소스]


    using System;

    using System.Drawing;

    using System.Collections;

    using System.ComponentModel;

    using System.Windows.Forms;

    using System.Data;

    using System.Diagnostics;

    using System.IO;

    using System.Threading;


    namespace mouseEvents

    {


        public class Form1 : System.Windows.Forms.Form

        {

            private System.Windows.Forms.TextBox textBox1;

            private System.Windows.Forms.Label label2;

            private System.ComponentModel.IContainer components;

            private System.Windows.Forms.TextBox tbComm;

            private System.Windows.Forms.Button btnExec;



            public Form1()

            {

                InitializeComponent();

            }


            protected override void Dispose( bool disposing )

            {

                if( disposing )

                {

                    if (components != null)

                    {

                        components.Dispose();

                    }

                }

                base.Dispose( disposing );

            }


            #region Windows Form Designer generated code

            /// <summary>

            /// Required method for Designer support - do not modify

            /// the contents of this method with the code editor.

            /// </summary>

            private void InitializeComponent()

            {

                this.label2 = new System.Windows.Forms.Label();

                this.tbComm = new System.Windows.Forms.TextBox();

                this.btnExec = new System.Windows.Forms.Button();

                this.textBox1 = new System.Windows.Forms.TextBox();

                this.SuspendLayout();

                //

                // label2

                //

                this.label2.Location = new System.Drawing.Point(8, 8);

                this.label2.Name = "label2";

                this.label2.Size = new System.Drawing.Size(72, 17);

                this.label2.TabIndex = 5;

                this.label2.Text = "도스명령어:";

                //

                // tbComm

                //

                this.tbComm.Location = new System.Drawing.Point(80, 8);

                this.tbComm.Name = "tbComm";

                this.tbComm.Size = new System.Drawing.Size(355, 21);

                this.tbComm.TabIndex = 6;

                this.tbComm.Text = "";

                //

                // btnExec

                //

                this.btnExec.Location = new System.Drawing.Point(440, 8);

                this.btnExec.Name = "btnExec";

                this.btnExec.Size = new System.Drawing.Size(104, 25);

                this.btnExec.TabIndex = 1;

                this.btnExec.Text = "실행";

                this.btnExec.Click += new System.EventHandler(this.button2_Click);

                //

                // textBox1

                //

                this.textBox1.AcceptsReturn = true;

                this.textBox1.AcceptsTab = true;

                this.textBox1.Location = new System.Drawing.Point(8, 32);

                this.textBox1.Multiline = true;

                this.textBox1.Name = "textBox1";

                this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;

                this.textBox1.Size = new System.Drawing.Size(528, 312);

                this.textBox1.TabIndex = 2;

                this.textBox1.Text = "";

                //

                // Form1

                //

                this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);

                this.ClientSize = new System.Drawing.Size(547, 350);

                this.Controls.Add(this.tbComm);

                this.Controls.Add(this.label2);

                this.Controls.Add(this.textBox1);

                this.Controls.Add(this.btnExec);

                this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;

                this.MaximizeBox = false;

                this.Name = "Form1";

                this.Text = "Process Class";

                this.ResumeLayout(false);


            }

            #endregion


            [STAThread]

            static void Main()

            {

                Application.Run(new Form1());

            }


            private void button2_Click(object sender, System.EventArgs e)

            {

                this.start();

            }


            private void start()

            {


                //Network 변수

                StreamWriter DosWriter;

                StreamReader DosRedaer;

                StreamReader ErrorReader;

               

                //프로세스 생성및 초기화

                Process DosPr = new Process();

               

                ProcessStartInfo psI = new ProcessStartInfo("cmd");

                psI.UseShellExecute = false;

                psI.RedirectStandardInput = true;

                psI.RedirectStandardOutput = true;

                psI.RedirectStandardError = true;

                psI.CreateNoWindow = true;



                //명령 실행

                DosPr.StartInfo = psI;

                DosPr.Start();

                DosWriter = DosPr.StandardInput;

                DosRedaer = DosPr.StandardOutput;

                ErrorReader = DosPr.StandardError;


                DosWriter.AutoFlush = true;


                DosWriter.WriteLine(tbComm.Text);

               

                DosWriter.Close();


                //출력

                textBox1.Text = DosRedaer.ReadToEnd();

                textBox1.Text += ErrorReader.ReadToEnd();


            }

        }

    }



      작성자 : HOONS(박경훈)
      이메일 : tajopkh@hanmail.net

    출처 : http://www.cyworld.com/nowy/192742

    Posted by 나비:D
    :

    출처 : http://tjstory.tistory.com/120

    Visual Studio Setup and Deployment


    여기저기 포스트를 뒤져보는데 셋업에 관련한 포스트는 없는 듯 하군요..
    못찾는 것인지.. 
    제가 사용하는 범위 내에서 셋업 프로젝트에 관해 알아보고자 합니다.
    중간 중간 링크되는 URL 은 관련사항에 대한 문서입니다. 대부분이 MSDN 일텐데..
    입맛에 안맞으신다거나 좀더 깊히 들어가고 싶으신분들은 참조 하시면 좋겠습니다.
    혹 궁금한 사항이 있으시다면 글 남겨주시면 답변 드리겠습니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

    환경 : VS 2008, .Net 2.0

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    프로젝트 생성

    MSDN .Net 을 이용하여 설치 패키지를 만드는 방법
    http://support.microsoft.com/kb/307353

    사용자 삽입 이미지

    사용자 삽입 이미지

    셋업 프로젝트에서 제공되는 기능들에 대해서는 View 영역에서 확인하실 수 있습니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

    프로젝트 속성
    사용자 삽입 이미지
    프로젝트 선택후 속성 창의 모습입니다.
    [Localization] 은 기본 English 인데 , 이부분을 Korean 으로 바꿔 줍니다.
    이부분을 영어로 했을경우 프로젝트내에 한글 인식이 안됩니다.
    [Manufacture] 항목은 회사명으로 배포시 설치되는 경로가 됩니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    파일 포함하기
    사용자 삽입 이미지
    Application Folder : 응용프로그램 설치 폴더에 포함되는 파일들
    User's Desktop : 바탕화면에 포함되는 파일들
    User's Programs Menu : 시작 메뉴에 포함되는 파일들

    [Application Folder]  항목에서 우클릭 메뉴를 확인하면, 파일을 추가 할 수가 있습니다.
    이곳에 추가되는 파일들은 설치 응용프로그램 폴더에 포함됩니다.

    바로가기 아이콘 만들기
    http://support.microsoft.com/kb/307358/
    [Application Folder] 에 포함된 파일중 바로가기 아이콘을 생성하고자 하는 실행 파일을 선택합니다.
    실행파일 우클릭 메뉴를 확인하시고, 바로가기 아이콘을 생성합니다.
    바로가기 아이콘은 같은 카테고리 안에 생성됩니다.
    생성된 아이콘을 마우스 드래그 하여 User's Desktop, User's Programs Menu 항목에 추가 할 수 있습니다.
    생성된 아이콘의 프로퍼티를 조정하여 Icon을 설정 하실 수 있습니다.
    사용자 삽입 이미지
    [Icon] [Browser] 클릭하여 Icon  파일을 연결합니다.

    설치 경로 셋팅하기
    이상태로 빌드를 한후, 설치를 해보게 되면 설치 되는 폴더의 경로가 Program Files \ Default Company로 설정될 것입니다.
    이 경로에 대한 설정은 [Application Folder]의 프로퍼티에서 변경 할 수 있습니다.
    사용자 삽입 이미지

    DefaultLocation의 경로를 보게되면, [Manufacturer] 이라는 부분이 있는데 이부분이 회사명에 해당되는 곳입니다.
    [Manufacturer]에 해당되는 곳에 회사 명을 포함하여 설치 경로를 조정할 수 있습니다.
    예> [ProgramFilesfolder]MyCompany\[Productname]

    여기까지의 진행만으로도 파일과 바로가기가 포함된 간단한 셋업 파일을 만들 수 있겠군요.


    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

    UI Interface
    사용자가 응용프로그램을 설치 할 때 보게 되는 다이얼로그의 UI에 해당하는 사항을 설정할 수 있는 부분입니다.
    간단하게 메세지를 표현 할 수도 있고, CheckBox 등의 컨트롤을 추가할 수 있습니다.
    http://msdn2.microsoft.com/en-us/library/ecaca8zb(VS.80).aspx
    사용자 삽입 이미지

    트리의 각 항목들의 프로퍼티값을 조정하여 UI를 설정할 수 있습니다. 몇가지만 살펴보면..
    [Welcome] CopyrightWarning, WelcomeText 설치 시 첫 페이지에 해당 메세지 들이 표시 됩니다.
    [Finished] UpdateText 설치 종료시 표시되는 메세지 입니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    CustomAction

    [CustomAction]은 설치 도중 사용자에 의해 행해지는 작업을 의미 합니다.
    예를 들어 응용프로그램이 실행 되기 위해서 닷넷 2.0 이 설치 되어 있어야 한다면,
    개발자는 배포시에 닷넷 2.0 또한 같이 배포 되길 원할 것입니다.
    CustomAction 에는 4개의 카테고리(Install, Commit, Rollback, Uninstall)가 존재합니다.
    각 카테고리는 설치 단계를 의미 합니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

    사용자 선택에 따른 조건부 설치 설정

    http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vsintro7/html/vxwlkwalkthroughpassingdatatocustomaction.asp

    Condition 라는 속성 값을 통해서 프로그램의 배포시에 특정 파일을 포함 시키거나
    혹은 특정 CustomAction 을 행하느냐 하지 않느냐를 결정 할 수 있습니다.
    사용자 삽입 이미지
    Filesystem 에 두개의 임의로 제작한 실행 파일을 등록 하였습니다.

    사용자 삽입 이미지

    [User Interface] [Start] 우클릭 메뉴에서 2개의 라디오 버튼을 포함하는 다이얼로그를 추가 합니다.
    다이얼로그를 Welcome 항목 밑에 위치 시킵니다.
    <참조> 모든 사용자 지정 대화 상자는 설치 폴더 대화 상자 또는 웹 설치 프로젝트의 설치 주소 대화 상자 앞에 와야 합니다.

    사용자 삽입 이미지

    추가된 다이얼로그의 프로퍼티 창 입니다.
    두개의 라디오 버튼중 1번째 버튼은 Yes 항목  2번째 버튼은 No 항목으로 설정 하였습니다.
    ButtonProperty 프로퍼티의 BUTTON2  값은 변수와 같은 개념으로 이 값을 통해 선택된 라디오 버튼을 확인합니다.
    사용자 삽입 이미지

    FileSystem 에서 추가한 exe 실행 파일을 Custom Actions 에서 Actions 으로 추가합니다.
    추가된 실행 파일의 프로퍼티 창을 보면 Condition 항목을 확인 할 수 있습니다.
    사용자 삽입 이미지

    Arguments 항목을 /Install 로 설정합니다.
    Conditions 항목을 BUTTON2=1 로 설정합니다. 눈치 채셨겠지만 추가된 다이얼로그의 버튼 항목입니다.
    BUTTON2 항목이 1값으로 선택되었을 경우 작동 합니다.
    그냥 조건문이라 생각하시면 되겠군요
    InstallerClass 항목을 False 로 설정 합니다.


    사용자 삽입 이미지

    Yes 선택시 CustomAction.exe 가 실행되고, No를 선택시 무시 됩니다.
    이처럼 사용자의 선택에 따라 Custom Action을 지정할 수 있지만, 또한 응용프로그램에 포함되는 파일을 설치시 추가 제거 할 수 있습니다.
    앞전에 FileSystem 에서 추가한 Setup_Application.exe 의 Condition 항목에 BUTTON2=1 이라고 설정하였다면
    No를 선택시 CustomAction.exe가 설치 되지 않을 뿐만아니라
    설치가 종료되고 해당 폴더를 확인하면 Setup_Application.exe가 포함되지 않았음을 알 수 있습니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    VerSionNT

    http://www.tarma.com/support/tin3/0100-using/0035-symbols/0200-variables/versionnt.htm

    조건부 설치 항목에서 Condition 속성에 대해서 알아 봤습니다.
    Condition 속성을 이용하면 운영체제에 따른 조건부 설치를 진행 할 수 있습니다.
    예를 들어 Condition 속성에  VersionNT>=500 값을 설정 합니다.
    VersionNT 는 OS 의 버젼에 따른 값으로 아래와 같습니다.
    사용자 삽입 이미지

    이 표를 볼때 500 이상이라는 값은 Windows 2000 이상의 버젼을 의미 하겠군요

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    .Net의 재배포, 시작조건
    http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vsintro7/html/vxwlkwalkthroughpassingdatatocustomaction.asp

    배포하려는 프로그램이 .Net의 특정 버젼을 필요로 한다면 개발자는 .Net을  같이 배포 하길 원할 것입니다.
    Microsoft Data Access Componets 를 이용하여 시작 조건을 검사 .Net 을 배포 할 수 있습니다.

    사용자 삽입 이미지

    셋업 프로젝트의 우클릭 메뉴 속성 창을 열어 보면 우측 하단에 Prerequisites 을 발견 할 수 있습니다.
    이는 셋업이 진행 되기 전에 필요한 MDAC 를 추가 하는 창으로거 필요한 컴포넌트에 체크를 하시면 됩니다.

    체크 박스 리스트 아래 쪽으로 컴포넌트를 다운로드 하는 방법에 대해서 지정할 수 있는데요.
    웹을 통해서, 로컬 경로를 통해서 등... 3가지 경우를 선택 할 수 있습니다.

    2번째에 위치한 "응용프로그램과 같은 로컬 경로"를 선택 하였습니다.

    이렇게 설정하신후 빌드를 하게 되면 셋업 파일 이외에 시작조건에 필요한 컴포넌트들이 포함된 폴더가 생성이 되는군요.

    사실 Vista에서 .Net 3.0 은 Windows 기능으로 포함 되어 있어.. 실행 파일 형식으로 제공되는 .Net의 설치는 할 수 없었습니다.
    설치를 시도 할경우 경고 메세지를 띄우게 되죠.
    빌드후 생성된 파일은 EnableDotNet 이라는 파일이군요. 이 파일은 실제적으로 닷넷을 설치 하는 것이 아니라.
    플렛폼에서 닷넷을 사용할 수 있도록.. 설치가 필요하면 설치를.. 혹은 기능의 추가를.. 해주나 봅니다.
    그래서!! Vista 에서 무리 없이 동작하는 군요.

    현재 MDAC 는 2.1 sp1 버젼까지 업데이트 되어 있군요.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    시작조건 검사

    http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vsintro7/html/vxwlkwalkthroughpassingdatatocustomaction.asp
    배포의 시작시에 특정 프로그램의 설치 여부를 확인 할 수 있다면, 이를 확인하여 프로그램을 배포할 수가 있습니다.
    WMP11 을 같이 배포 해야 했기에 이에 대해서 알아 보도록 하겠습니다.
    [보기][시작조건] 을 클릭 하면 시작 조건 창을 열 수 있습니다.
    사용자 삽입 이미지

    팝업 메뉴를 보면 파일, 레지스트리, 윈도우 인스톨러, 닷넷, 서비스 등의 시작 조건을 검사 할 수 있습니다.
    레지스트리 시작조건을 추가 해보면 [Search Target Machine]  [Luanch Conditions] 에 각각 레스스트리 탐색과, 시작 조건노드가 생성 됩니다.
    말그대로 레지스트리 탐색은 레지스트리내 특정 키 값을 할당하고 프로퍼티화 합니다.
    생성된 컨디션은 이 프로퍼티의 값을 비교 하여 특정 작업을 시행합니다.

    WMP11의 버전을 확인 하여 없을 경우 설치 하는 작업을 진행 해보면..

    사용자 삽입 이미지
    Root 의 vsdrrHKLM 은 HKEY_LOCAL_MACHINE 를 뜻한다.
    RegKey에 검색할 키 값을 채워준다.
    Value 에 레지스트리 이름을 준다.
    Property 는 외부로 노출되는 변수와 같은 개념으로 특정한 이름을 명명한다.
    사용자 삽입 이미지
    생선된 컨디션의 Condition 에 방금 생성한 레지스트리 탐색의 프로퍼티 값을 주고 값을 비교합니다.
    "11,0,5721,5145"는 필자가 넣은 값으로 WMP11의 XP버젼의 레지스트리 값입니다.
    위 조건을 만족하지 않는 경우에 Message 항목을 출력하고 InstallUrl의 경로를 실행합니다.
    InstallUrl에 필자는 상대 경로를 주었는데.. 위 폴더는 빌드 Release 에 포함되어 있습니다.
    CD 로 배포시에 이런 방법이 유용하고, 실제로 유효한 Web 주소를 주어도 해당 웹페이지를 실행 시켜 줍니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    파일 형식

    http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vsintro7/html/vxwlkwalkthroughpassingdatatocustomaction.asp

    배포 되는 실행파일에 연결되는 문서 형식을 지정하는 곳입니다.
    예를 들어 .hwp 파일을 클릭하면 한글이 실행되듯이..

    사용자 삽입 이미지
    우측에 [FileType on Target Marchine]의 우클릭 메뉴로 파일 타입을 생성 할 수 있습니다.
    좌측은 생성된 파일 타입의 프로퍼티 창입니다.
    Extension 란에 확장자를 넣어 주시면 되구요, 세미콜론(;)을 이용하여 여러개를 지정할 수 있습니다.

    참고 파일 형식은 설치된 실행 파일 하나에만 연결할 수 있습니다.
    두 개 이상의 실행 파일을 파일 형식과 연결하려면 먼저 각 실행 파일에 대한 조건을 지정하여 지정된 설치에 대해 하나만 설치되도록 해야 합니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    마치며..

    제가 직접 해보면서 작성한 포스트라 순서가 순차적이지 않을 수가 있습니다. 이해를 ^^;;
    레지스트리 편집기에 대해선 알아보지 않았군요. 사용하진 않았지만 특별히 어려운 사항은 없으리라 생각합니다.
    포스트중 제가 잘못 알고 있거나 놓친 부분이 있다면 댓글을 남겨주시면 감사하겠습니다
    Posted by 나비:D
    :
    메시지 필터를 이용하여 F1, F2, F3 .. 키 입력을 후킹하기.
     
     
    public class MessageFilter : System.Windows.Forms.IMessageFilter
    {
        public bool PreFilterMessage(ref Message m)
        {
            switch(m.Msg)
            {
                case 256 : // WM_KEYDOWN     <==== windows message 를 C# 형태로 쓰고 싶었지만.. 딱히 만들어져있는게 없더군요 그래서
                                //                                    인터넷에서 windows.h 파일을 검색해서 찾았습니다. WM_KETDOWN = 256 번이더군요.
                    System.Console.WirteLine(m.LParam.ToInt32());        // 이걸로 F1 부터 여러가지 키를 차례데로 눌러본 값들이
                    if( m.LParam.ToInt32() == 3866625 ) // F1 Key            // <===  이 값들입니다. 3866625 가 F1 이군요.. 이런식으로 Key 값을 찾아서
                    {                                                                            // 계속 추가하면 키보드 후킹.. 그다지 어려운건 아닐거 같군요 ^^;;
                        System.Console.WriteLine("F1 Press");
                        return true;
                    }
                    else if( m.LParam.ToInt32() == 3932161 )    // F2 Key
                    {
                        System.Console.WriteLine("F2 Press");
                        return true;
                    }
                    else if( m.LParam.ToInt32() == 3997697 )    // F3 Key
                    {
                        System.Console.WriteLine("F3 Press");
                        return true;
                    }
                    break;
            }
            return false;
        }
    }
     
    //
    //     만들어 놓은 MessageFilter 는 반드시 AddMessageFilter 메서드를 통해 추가해줘야 합니다.
    //    static void Main 함수는 기본 Form 에 포함되어 있습니다.  :) 아시죠?
     
    static void Main()
    {
        Application.AddMessageFilter(new MessageFilter());
        Application.Run(new JapExamples());
    }
     
     
    아래 있는 것은 windows.h 파일에 정의된 windos message 들입니다. windows.h 파일은 visual studio 안에 INCLUDE_ROOT 에 있습니다.
    어딘지는 아시죠?
     
     
    WA_ACTIVE 1
    WA_CLICKACTIVE 2
    WA_INACTIVE 0
    WM_ACTIVATE 6
    WM_ACTIVATEAPP 28
    WM_AFXFIRST 864
    WM_AFXLAST 895
    WM_APP 32768
    WM_ASKCBFORMATNAME 780
    WM_CANCELJOURNAL 75
    WM_CANCELMODE 31
    WM_CAPTURECHANGED 533
    WM_CHANGECBCHAIN 781
    WM_CHAR 258
    WM_CHARTOITEM 47
    WM_CHILDACTIVATE 34
    WM_CLEAR 771
    WM_CLOSE 16
    WM_COMMAND 273
    WM_COMMNOTIFY 68
    WM_COMPACTING 65
    WM_COMPAREITEM 57
    WM_CONTEXTMENU 123
    WM_COPY 769
    WM_COPYDATA 74
    WM_CREATE 1
    WM_CTLCOLORBTN 309
    WM_CTLCOLORDLG 310
    WM_CTLCOLOREDIT 307
    WM_CTLCOLORLISTBOX 308
    WM_CTLCOLORMSGBOX 306
    WM_CTLCOLORSCROLLBAR 311
    WM_CTLCOLORSTATIC 312
    WM_CUT 768
    WM_DEADCHAR 259
    WM_DELETEITEM 45
    WM_DESTROY 2
    WM_DESTROYCLIPBOARD 775
    WM_DEVICECHANGE 537
    WM_DEVMODECHANGE 27
    WM_DISPLAYCHANGE 126
    WM_DRAWCLIPBOARD 776
    WM_DRAWITEM 43
    WM_DROPFILES 563
    WM_ENABLE 10
    WM_ENDSESSION 22
    WM_ENTERIDLE 289
    WM_ENTERMENULOOP 529
    WM_ENTERSIZEMOVE 561
    WM_ERASEBKGND 20
    WM_EXITMENULOOP 530
    WM_EXITSIZEMOVE 562
    WM_FONTCHANGE 29
    WM_GETDLGCODE 135
    WM_GETFONT 49
    WM_GETHOTKEY 51
    WM_GETICON 127
    WM_GETMINMAXINFO 36
    WM_GETOBJECT 61
    WM_GETTEXT 13
    WM_GETTEXTLENGTH 14
    WM_HANDHELDFIRST 856
    WM_HANDHELDLAST 863
    WM_HELP 83
    WM_HOTKEY 786
    WM_HSCROLL 276
    WM_HSCROLLCLIPBOARD 782
    WM_ICONERASEBKGND 39
    WM_IME_CHAR 646
    WM_IME_COMPOSITION 271
    WM_IME_COMPOSITIONFULL 644
    WM_IME_CONTROL 643
    WM_IME_ENDCOMPOSITION 270
    WM_IME_KEYDOWN 656
    WM_IME_KEYLAST 271
    WM_IME_KEYUP 657
    WM_IME_NOTIFY 642
    WM_IME_REQUEST 648
    WM_IME_SELECT 645
    WM_IME_SETCONTEXT 641
    WM_IME_STARTCOMPOSITION 269
    WM_INITDIALOG 272
    WM_INITMENU 278
    WM_INITMENUPOPUP 279
    WM_INPUTLANGCHANGE 81
    WM_INPUTLANGCHANGEREQUEST 80
    WM_KEYDOWN 256
    WM_KEYFIRST 256
    WM_KEYLAST 264
    WM_KEYUP 257
    WM_KILLFOCUS 8
    WM_LBUTTONDBLCLK 515
    WM_LBUTTONDOWN 513
    WM_LBUTTONUP 514
    WM_MBUTTONDBLCLK 521
    WM_MBUTTONDOWN 519
    WM_MBUTTONUP 520
    WM_MDIACTIVATE 546
    WM_MDICASCADE 551
    WM_MDICREATE 544
    WM_MDIDESTROY 545
    WM_MDIGETACTIVE 553
    WM_MDIICONARRANGE 552
    WM_MDIMAXIMIZE 549
    WM_MDINEXT 548
    WM_MDIREFRESHMENU 564
    WM_MDIRESTORE 547
    WM_MDISETMENU 560
    WM_MDITILE 550
    WM_MEASUREITEM 44
    WM_MENUCHAR 288
    WM_MENUCOMMAND 294
    WM_MENUDRAG 291
    WM_MENUGETOBJECT 292
    WM_MENURBUTTONUP 290
    WM_MENUSELECT 287
    WM_MOUSEACTIVATE 33
    WM_MOUSEFIRST 512
    WM_MOUSEHOVER 673
    WM_MOUSELEAVE 675
    WM_MOUSEMOVE 512
    WM_MOUSEWHEEL 522
    WM_MOVE 3
    WM_MOVING 534
    WM_NCACTIVATE 134
    WM_NCCALCSIZE 131
    WM_NCCREATE 129
    WM_NCDESTROY 130
    WM_NCHITTEST 132
    WM_NCLBUTTONDBLCLK 163
    WM_NCLBUTTONDOWN 161
    WM_NCLBUTTONUP 162
    WM_NCMBUTTONDBLCLK 169
    WM_NCMBUTTONDOWN 167
    WM_NCMBUTTONUP 168
    WM_NCMOUSEMOVE 160
    WM_NCPAINT 133
    WM_NCRBUTTONDBLCLK 166
    WM_NCRBUTTONDOWN 164
    WM_NCRBUTTONUP 165
    WM_NEXTDLGCTL 40
    WM_NEXTMENU 531
    WM_NOTIFY 78
    WM_NOTIFYFORMAT 85
    WM_NULL 0
    WM_PAINT 15
    WM_PAINTCLIPBOARD 777
    WM_PAINTICON 38
    WM_PALETTECHANGED 785
    WM_PALETTEISCHANGING 784
    WM_PARENTNOTIFY 528
    WM_PASTE 770
    WM_PENWINFIRST 896
    WM_PENWINLAST 911
    WM_POWER 72
    WM_POWERBROADCAST 536
    WM_PRINT 791
    WM_PRINTCLIENT 792
    WM_QUERYDRAGICON 55
    WM_QUERYENDSESSION 17
    WM_QUERYNEWPALETTE 783
    WM_QUERYOPEN 19
    WM_QUEUESYNC 35
    WM_QUIT 18
    WM_RBUTTONDBLCLK 518
    WM_RBUTTONDOWN 516
    WM_RBUTTONUP 517
    WM_RENDERALLFORMATS 774
    WM_RENDERFORMAT 773
    WM_SETCURSOR 32
    WM_SETFOCUS 7
    WM_SETFONT 48
    WM_SETHOTKEY 50
    WM_SETICON 128
    WM_SETREDRAW 11
    WM_SETTEXT 12
    WM_SETTINGCHANGE 26
    WM_SHOWWINDOW 24
    WM_SIZE 5
    WM_SIZECLIPBOARD 779
    WM_SIZING 532
    WM_SPOOLERSTATUS 42
    WM_STYLECHANGED 125
    WM_STYLECHANGING 124
    WM_SYNCPAINT 136
    WM_SYSCHAR 262
    WM_SYSCOLORCHANGE 21
    WM_SYSCOMMAND 274
    WM_SYSDEADCHAR 263
    WM_SYSKEYDOWN 260
    WM_SYSKEYUP 261
    WM_TCARD 82
    WM_TIMECHANGE 30
    WM_TIMER 275
    WM_UNDO 772
    WM_UNINITMENUPOPUP 293
    WM_USER 1024
    WM_USERCHANGED 84
    WM_VKEYTOITEM 46
    WM_VSCROLL 277
    WM_VSCROLLCLIPBOARD 778
    WM_WINDOWPOSCHANGED 71
    WM_WINDOWPOSCHANGING 70
    WM_WININICHANGE 26
     
    Posted by 나비:D
    :

    출처 : http://blog.naver.com/oioois?Redirect=Log&logNo=150028275081

    회사 업무중에 S/W적으로 LCD모니터의 전원을 제어할 경우가 생겨..

    가장 심플한 방법을 찾아 C#으로 구현해 보았다.

    -.Net 제공 관련 클래스를 찾지 못해 Win32 function 호출하는 방법 채택

    -일정 시간 후, 모니터 전원 ON을 위해 Timer 컨트롤 사용

    using System.Runtime.InteropServices;

    namespace monitorPowerCtlSample
    {
        public partial class MonitorPower : Form
        {

            const int WM_SYSCOMMAND = 0x0112;
            const int SC_MONITORPOWER = 0xF170;

            const int MONITOR_ON = -1;
            const int MONITOR_OFF = 2;
            const int MONITOR_STANBY = 1;

            [DllImport("user32.dll")]
            private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);  

            //Off버튼을 누르면 LCD모니터 전원을 OFF시킴

            private void btnOff_Click(object sender, EventArgs e)
            {
                SendMessage(this.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);
            }

            //Timer객체의 interval 시간을 적당히 10초정도 추가 테스트

            //10초정도 후에 LCD모니터 전원 ON됨

            private void timer1_Tick(object sender, EventArgs e)
            {
                SendMessage(this.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_ON);
            }

        }

    }

    테스트 중에 발생한 오류(?)가 있었다.

    전원 ON/OFF를 연속적으로 실행하자 LCD모니터가 절전모드로 들어가 버리는 경우가 있었다.

    이에 깊은 지식을 갖지 못한 관계로 아직 해답을 찾지는 못했다.

    Posted by 나비:D
    :

    BLOG main image
    by 나비:D

    공지사항

    카테고리

    분류 전체보기 (278)
    Programming? (0)
    ---------------------------.. (0)
    나비의삽질 (5)
    Application (177)
    C# (28)
    JAVA (22)
    ASP.NET (3)
    C++ (19)
    C (18)
    .NET (0)
    Visual Basic (12)
    Flex (16)
    Eclipse (8)
    Delphi (16)
    Visual Studio 2005 (5)
    Embed (6)
    Linux (2)
    Mobile (1)
    XML (1)
    안드로이드 (2)
    SQL (51)
    Web (27)
    etc. (14)
    Omnia (0)
    ---------------------------.. (0)

    최근에 올라온 글

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함

    달력

    «   2024/05   »
    1 2 3 4
    5 6 7 8 9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30 31
    Total :
    Today : Yesterday :