반응형

API를 이용해 어플을 만들면서 프로그램 실행중 로그를 출력하고 싶은 경우가 많다.

물론 디버깅을 활용하면 되지만 간단한 값의 출력이나 printf가 편한 경우고 있다.

API 함수를 이용해서 AllocConsole(); 로 생성하고 FreeConsole(); 로 해제해도 되지만

더 간단한 방법이 있어 소개한다.

프로그램이 맨 처음 시작되는 부분에 다음 코드를 추가해 보자
(예를 들면 stdafx.h 혹은 stdafx.cpp등에 입력해도 좋다.)
반응형

1. HWND → PID

DWORD GetWindowThreadProcessId(

    HWND hWnd,                             //  [in] 윈도우 핸들

    LPDWORD lpdwProcessId           //  [out] PID

);         

리턴 : hWnd의 Process ID (=파라미터 2)

 

2. PID → HANDEL

HANDEL OpenProcess(

    DWORD dwDesiredAccess,          // [in] 프로세스 접근 권한   최고 : MAXIMUM_ALLOWED

    BOOL bInheritHandle,                  // [in] 상속 여부  false

    DWORD dwProcessId                  // [in] PID

);

리턴 : PID의 HANDEL

cf. CloseProcess()

 

3. HANDEL → PID

DWORD GetProcessId(
    HANDLE Process                        // [in] 프로세스 핸들

);

리턴 : HANDEL의 PID


반응형

win32 console API

 

GetConsoleWindow                  //콘솔 윈도우 윈도우핸들 얻기
GetConsoleMode                     //현재 콘솔의 입출력 모드 얻기
SetConsoleMode                     //콘솔의 입출력 모드 설정
GetConsoleCursorPosition        //스크린 버퍼의 커서 위치 변경
GetConsoleCursorInfo              //스크린 버퍼의 커서 정보 얻기
SetConsoleCursorInfo              //스크린 버퍼의 커서 정보 설정
SetConsoleWindowInfo             //콘솔 윈도우의 정보 설정
CreatConsoleScreenBuffer        //스크린 버퍼 생성
GetConsoleScreenBufferInfo      //스크린 버퍼 정보 얻기
SetConsoleScreenBufferSize     //스크린 버퍼 크기 변경
SetConsoleTextAttribute            //기본 문자 속성 설정, 고수준 출력함수에서 사용
ScrollConsoleScreenBuffer        //스크린 버퍼의 내용 스크롤
SetConsoleActiveScreenBuffer   //활성 스크린 버퍼 변경
GetCurrentConsoleFont             //콘솔에서 사용중인 폰트 정보 얻기

 

COORD 구조체

콘솔에서 좌표를 나타내기위한 구조체

 

typedef struct _COORD { // coord.
    SHORT X;      // horizontal coordinate
    SHORT Y;      // vertical coordinate
} COORD;

 

// 커서의 좌표를 조사한다.
COORD getCursorPosition(void)
{
    CONSOLE_SCREEN_BUFFER_INFO buffInfo;

    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&buffInfo); //현재콘솔스크린버퍼에서 정보읽어와서

                                                                                                                  //buffInfo에 저장
    return   buffInfo.dwCursorPosition; //CONSOLE_SCREEN_BUFFER_INFO구조체형변수 buffInfo에 속한 멤버변수이고
}                                                   //COORD형인  dwCursorPosition을 리턴   (x,y좌표값이 들어있다)

//나중에 사용할 코딩부분 //////////////////
//콘솔의 스크린 버퍼사이즈 변경할 소스코드
COORD bufferSize = {80, 25};
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), bufferSize);
//////////////////////////////////////////////////////////////////////////////////////////



http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=72177697&qb=U2V0Q29uc29sZVNjcmVlbkJ1ZmZlclNpemU=&enc=utf8&section=kin&rank=2&sort=0&spq=0&pid=fINGjv331xwsssyZ6jZssv--057430&sid=S6b8EfbepksAAH9dHjI

http://www.adrianxw.dk/SoftwareSite/Consoles/Consoles6.html

http://msdn.microsoft.com/en-us/library/ms683231(VS.85).aspx <==GetStdHandle Function

Value Meaning
STD_INPUT_HANDLE
(DWORD)-10

The standard input device. Initially, this is the console input buffer, CONIN$.

STD_OUTPUT_HANDLE
(DWORD)-11

The standard output device. Initially, this is the active console screen buffer, CONOUT$.

STD_ERROR_HANDLE
(DWORD)-12

The standard error device. Initially, this is the active console screen buffer, CONOUT$.


STD_OUTPUT_HANDLE 활성화된 콘솔 스크린에 핸들을 가져오는 건가?? 

A console process uses handles to access the input and screen buffers of its console. A process can use the GetStdHandle, CreateFile, or CreateConsoleScreenBuffer function to open one of these handles.

The GetStdHandle function provides a mechanism for retrieving the standard input (STDIN), standard output (STDOUT), and standard error (STDERR) handles associated with a process. During console creation, the system creates these handles. Initially, STDIN is a handle to the console's input buffer, and STDOUT and STDERR are handles of the console's active screen buffer. However, the SetStdHandle function can redirect the standard handles by changing the handle associated with STDIN, STDOUT, or STDERR. Because the parent's standard handles are inherited by any child process, subsequent calls to GetStdHandle return the redirected handle. A handle returned by GetStdHandle may, therefore, refer to something other than console I/O. For example, before creating a child process, a parent process can use SetStdHandle to set a pipe handle to be the STDIN handle that is inherited by the child process. When the child process calls GetStdHandle, it gets the pipe handle. This means that the parent process can control the standard handles of the child process. The handles returned by GetStdHandle have GENERIC_READ | GENERIC_WRITE access unless SetStdHandle has been used to set the standard handle to have lesser access.

The value of the handles returned by GetStdHandle are not 0, 1, and 2, so the standard predefined stream constants in Stdio.h (STDIN, STDOUT, and STDERR) cannot be used in functions that require a console handle.

The CreateFile function enables a process to get a handle to its console's input buffer and active screen buffer, even if STDIN and STDOUT have been redirected. To open a handle to a console's input buffer, specify the CONIN$ value in a call to CreateFile. Specify the CONOUT$ value in a call to CreateFile to open a handle to a console's active screen buffer. CreateFile enables you to specify the read/write access of the handle that it returns.

The CreateConsoleScreenBuffer function creates a new screen buffer and returns a handle. This handle can be used in any function that accepts a handle to console output. The new screen buffer is not active until its handle is specified in a call to the SetConsoleActiveScreenBuffer function. Note that changing the active screen buffer does not affect the handle returned by GetStdHandle. Similarly, using SetStdHandle to change the STDOUT handle does not affect the active screen buffer.

Console handles returned by CreateFile and CreateConsoleScreenBuffer can be used in any of the console functions that require a handle to a console's input buffer or of a console screen buffer. Handles returned by GetStdHandle can be used by the console functions if they have not been redirected to refer to something other than console I/O. If a standard handle has been redirected to refer to a file or a pipe, however, the handle can only be used by the ReadFile and WriteFile functions.

A process can use the DuplicateHandle function to create a duplicate console handle that has different access or inheritability from the original handle. Note, however, that a process can create a duplicate console handle only for its own use. This differs from other handle types (such as file, pipe, or mutex objects), for which DuplicateHandle can create a duplicate that is valid for a different process.

To close a console handle, a process can use the CloseHandle function.


콘솔 생성

BOOL AllocConsole(VOID);
콘솔창을 생성한다. 실패하면 FALSE을 반환한다.

BOOL FreeConsole(VOID);
열려진 콘솔을 닫는다.

HANDLE GetStdHandle(DWORD nStdHandle);
콘솔의 표준 핸들을 구하는 함수이다.
인자로 STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE 중 하나를 넣어준다.

콘솔 정보 구하기

BOOL GetConsoleSc0reenBufferInfo(
HANDLE hConsoleOuput, // 콘솔의 핸들
PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo // 콘솔의 정보와 관련된 구조체
);
콘솔의 커서의 위치와 콘솔의 정보를 조사한다.

typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
COORD dwSize; // 화면 버퍼의 크기. 크기는 셀 단위이다.
COORD dwCursorPosition; // 커서의 현재 위치
WORD wAttributes; // 출력될 문자의 전경색과 배경색의 정보
SMALL_RECT srWindow; // 현재 보이는 화면 영역에 대한 좌표
COORD dwMaximumWindowSize; // 최대 화면의 크기 모니터의 해상도와 시스템 글꼴에 따라 달라진다.
} CONSOLE_SCREEN_BUFFER_INFO ;

전경, 배경 컬러
#define FOREGROUND_BLUE 0x0001
#define FOREGROUND_GREEN 0x0002
#define FOREGROUND_RED 0x0004
#define FOREGROUND_INTENSITY 0x0008
#define BACKGROUND_BLUE 0x0010
#define BACKGROUND_GREEN 0x0020
#define BACKGROUND_RED 0x0040
#define BACKGROUND_INTENSITY 0x0080

typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD;

typedef struct _SMALL_RECT {
SHORT Left;
SHORT Top;
SHORT Right;
SHORT Bottom;
} SMALL_RECT;

BOOL SetConsoleCursorPosition(
HANDLE hConsoleOutput, // 콘솔의 핸들
COORD dwCursorPosition // 커서의 위치
);
콘솔의 커서의 위치를 설정한다.

BOOL SetConsoleCursorInfo(
HANDLE hConsoleOutput, // 콘솔 핸들
CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo // 커서 모양의 구조체
);
커서의 크기를 구조체의 정보에 의해 바꾼다.

typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize; // 100분율의 크기
BOOL bVisible; // FALSE 로 하면 보이지 않음
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;

BOOL GetConsoleCursorInfo(
HANDLE hConsoleOutput, // 콘솔 핸들
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo // 커서 정보
);
위의 함수에 상응하는 커서 정보를 알아오는 함수이다.

BOOL SetConsoleMode(
HANDLE hConsoleHandle, // 콘솔 핸들
DWORD dwMode // 모드
);
콜솔 모드를 선택한다.
밑의 모드들은 OR연산으로 중복 선택이 가능하다.

dwMode
ENABLE_PROCESSED_INPUT
편집키와 제어키를 문자 입력으로 받지 않고 해당 키의 기능을 처리하도록 한다.
BackSpace, Enter등의 제어키들의 기능을 수행한다.

ENABLE_LINE_INPUT
ReadFile, ReadConsole등의 함수로 문자열을 받을 때 Enter키가 눌러질 때 까지 입력을 받는다.
이 모드가 설정되어 있지 않으면 입력 버퍼에 한글자라도 있으면 바로 리턴한다.

ENABLE_ECHO_INPUT
입력중인 문자열을 화면으로 다시 보여주어 사용자가 확인할 수 있도록 해 준다.
이 모드가 설정되어 있지 않으면 입력중인 문자열을 사용자가 볼 수 없다.

ENABLE_MOUSE_INPUT
마우스의 커서의 위치, 변화, 클릭, 더블클릭등의 상태를 조사할 수 있다.

ENABLE_WINDOW_INPUT
콘솔창의 등록 정보창에서 화면 버퍼의 크기를 변경할 경우 버퍼 크기 변경 이벤트를 입력 버퍼에 넣는다. 버퍼의 크기에 따라 화면을
재구성해야 한다면 이 이벤틀를 받아서 처리한다.
나머지 다섯가지 입력 모드중 이 모드만 디폴트로 제외 되어 있다.

ENABLE_PROCESSED_OUTPUT
출력시 제어코드를 문자로 출력하지 않고 기능으로 출력한다.

ENABLE_WRAP_AT_EOL_OUTPUT
행의 끝 부분에 문자가 출력될때 다음줄로 자동으로 개행된다. 화면의 제일 아래쪽으로 출력되고자 할때 화면을 스크롤 한다.

BOOL GetConsoleMode(
HANDLE hConsoleHandle, // 콘솔 핸들
LPDWORD lpMode // 모드
);
현재의 콘솔의 모드를 반환한다.

BOOL SetConsoleCtrlHandler(
PHANDLER_ROUTINE HandlerRoutine, // 함수 포인터
BOOL Add // TRUE이면 이 핸들러가 추가되고, FALSE 이면 제거 된다.
);
콘솔의 핸들러를 지정한다.

핸들러의 원형은 밑의 형식이다.
BOOL WINAPI HandlerRoutine(DWORD dwCtrlType);
여기서 넘어오는 dwCtrlType은 이 핸들러 함수를 호출한 신호 유형을 알려준다.
여기서 반환되는 값이 TRUE이면 나머지 등록되어 있는 핸들러는 실행 되지 않는다.
FALSE를 반환할때는 다음 핸들러로 제어를 넘긴다.
dwCtrlType
CTRL_C_EVENT Ctrl+C 가 입력되었음
CTRL_BREAK_EVENT Ctrl+Break가 입력되었음
CTRL_CLOSE_EVENT 콘솔창이 닫힐 때 이 콘솔에 연결된 모든 프로세스에게 보내진다.
CTRL_LOGOFF_EVENT 사용자가 로그오프할 때 보내진다.
CTRL_SHUTDOWN_EVENT 시스템이 셧다운될 때 보내진다.

HANDLE CreateConsoleScreenBuffer(
DWORD dwDesiredAccess, // 버퍼의 읽기, 쓰기모드에 대한 내용 ( GENERIC_READ, GENERIC_WRITE등의 플래그 조합 )
DWORD dwShareMode, // 콘솔의 공유 모드. 공유하지 않을때는 0.
CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 보안 설명자. 그냥 NULL.
DWORD dwFlags, // 콘솔의 타입인데 현재 가능한 값은 CONSOLE_TEXTMODE_BUFFER 만 있음.
LPVOID lpScreenBufferData // 예약 값. 무조건 NULL.
);
복수개의 화면을 생성한다. 콘솔의 입력 버퍼는 하나만 존재하지만 출력 버퍼는 여러개가 존재 할수 있다.

BOOL SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput);
화면 출력 버퍼를 선택한다.


콘솔에 쓰기

DWORD WriteConsole(
HANDLE hConsoleOutput, // 콘솔 핸들
CONST VOID *lpBuffer, // 버퍼
DWORD nNumberOfCharsToWrite, // 쓰여질 문자열의 길이
LPDWORD lpNumberOfCharsWritten, // 쓰여진 문자열의 길이
LPVOID lpResserved // 예약된 변수
);
ANSI문자열이나 UNICODE문자열을 출력할수 있다. WriteFile함수로도 콘솔 핸들로 출력할수 있으니 ANSI파일밖에 출력 할 있다.

BOOL WriteConsoleOutput(
HANDLE hConsoleOutput, // 콘솔 핸들
CONST CHAR_INFO *lpBuffer, // 버퍼
COORD dwBufferSize, // 버퍼의 크기 (X,Y의 좌표로 행과 열을 뜻한다.)
COORD dwBufferCoord, // 버퍼내의 출력 대상 셀의 좌표를 지정한다.
PSMALL_RECT lpWriteRegion // 화면의 출력할 좌표
);
문자와 색상의 속성으로 콘솔에 출력한다.

typedef struct _CHAR_INFO {
union {
WCHAR UnicodeChar;
CHAR AsciiChar;
} Char;
WORD Attributes;
} CHAR_INFO, *PCHAR_INFO;

BOOL WriteConsoleOutputCharacter(
HANDLE hConsole hConsoleOutput, // 콘솔 핸들
LPCTSTR lpCharacter, // 문자열
DWORD nLength, // 길이
COORD dwWriteCoord, // 위치
LPDWORD lpNumberOfCharsWritten // 쓰여진 문자열의 길이
);
위치에 문자를 출력한다.

BOOL WriteConsoleOutputAttribute(
HANDLE hConsoleOutput, // 콘솔 핸들
CONST WORD *lpAttribute, // 속성
DWORD nLength, // 길이
COORD dwWriteCoord, // 위치
LPDWORD lpNumberOfAttrsWritten // 쓰여진 속성의 크기
);
위치의 속성을 변경한다.

콘솔에서 읽기

BOOL ReadConsole(
HANDLE hConsoleInput, // 콘솔핸들
LPVOID lpBuffer, // 버퍼
DWORD nNumberOfCharsToRead, // 읽을 문자열의 길이
LPDWORD lpNumberOfCharsRead, // 읽어진 변수
LPVOID lpReserved // 예약된 변수
);
ANSI문자열이나 UNICODE문자열을 읽을 수 있다.

출력 3함수에 대응하는
ReadConsoleOutput
ReadConsoleOutputCharacter
ReadConsoleOutputAttribute

//콘솔 어태치?


//어태치  사용




반응형
 
- CWnd 클래스는 MFC의 모든 윈도우 클래스들에 대해서 기본적인 기능을 제공 하는 클래스이다. 

데이터 멤버
m_hWnd : CWnd와 관련된 HWND를 가리킨다. 


생성/소멸 관련 함수
CWnd : CWnd객체를 생성한다.
DestroyWindow : 윈도우를 소멸한다. 그렇지만 객체를 소멸시키는 것은 아니다. 


초기화 관련 함수
Create : CWnd 객체와 관련된 자식 윈도우를 만들고 초기화한다.
PreCreateWindow : CWnd 객체와 관련된 실제 윈도우를 만들기 전에 호출된다.
CaleWindowRect : 클라이언트 사각형 영역에서 윈도우를 만들기 전에 호출된다.
GetStyle : 현재 윈도우의 스타일을 반환한다.
GetExStyle : 확장된 윈도우의 스타일을 반환한다.
Attach : CWnd 객체에 윈도우 핸들을 추가한다.
Detach : CWnd 객체에서 윈도우 핸들을 분리하고 핸들을 반환한다.
PreSubclassWindow : SubclassWindow가 호출되기 전에 필요한 다른 서브클래싱이 일어나 는 것을 허용한다.
SubclassWindow : CWnd 객체에 윈도우를 추가하고 CWnd의 메시지맵을 통해서 루트 메시 지로 만든다.
UnSubclassWindow : CWnd 객체에서 윈도우를 분리한다.
FromHandle : 윈도우에 핸들이 주어질 때 CWnd 객체에 대한 포인터를 반환한다. CWnd 객체가 핸들을 가지지 않는다면, 임시적인CWnd 객체기 생성되고 추가된다.
FromHandlePermanent : 윈도우에 핸들이 주어질 때 CWnd 객체에 대한 포인터를 반환한다. 
CWnd 객체가 핸들을 가지지 않는다면, NULL이 반환된다.
DeleteTempMap : CWinApp가 자동으로 호출하며 FromHandle에 의해서 생성된 어떠한 임시 CWnd 객체도 지운다.
GetSafeHwnd : 포인터가 NULL이면, m_hWnd, 또는 NULL을 반환된다.
CreateEx : 오버랩된 형태의 팝업 자식 윈도우를 생성하고 이것을 CWnd 객체에 추가한다
CreateControl : MFC 프로그램에서 CWnd 객체에 의해서 표현되는 OLE 컨트롤을 생성한다. 


윈도우 상태 함수
IsWindowEnabled : 윈도우에 마우스와 키보드 입력이 가능한지를 결정한다.
EnableWindow : 윈도우에 마우스와 키보드로 입력을 가능하게 하거나 불가능하도록 한다.
GetActiveWindow : 활성 윈도우를 얻는다.
SetActiveWindow : 윈도우를 활성화한다.
GetCapture : 마우스를 캡쳐한 CWnd를 얻는다.
SetCapture : 모든 일련의 마우스 입력이 CWnd로 보내지도록 한다.
GetFocus : CWnd가 현재 입력 포커스를 가지고 있는지 검사한다.
SetFocus : 입력 포커스를 설정한다.
GetDestktopWindow : 윈도우 시스템의 desktop윈도우를 얻는다.
GetForegroundWindow : 포그라운드 윈도우의 포인터를 반환한다.
SetForegroundWindow : 생성된 윈도우의 스레드를 포그라운드로 설정하고 윈도우를 활성 화 한다.
GetIcon : 핸들에서 아이콘을 얻는다.
SetIcon : 핸들에 특정 아이콘을 설정한다.
GetWindowContextHelpId : 도움말 항목에 대한 식별자를 얻는다.
SetWindowContextHelpId : 도움말 항목에 대한 식별자를 지정한다.
ModifyStyle : 현재 윈도우의 스타일을 수정한다.
ModifyStyleEx : 확장된 윈도우의 스타일을 수정한다. 
IsWindow(HWND hWnd):  윈도우가 존재하면 TRUE 아니면 FALSE
IsWindowVisible(HWND hWnd): 윈도우가 보이면 TRUE 아니면 FALSE

윈도우의 크기와 위치
GetWindowPlacement : 윈도우가 보여지는 상태와 정상(복귀된), 최소, 최대화된 윈도우의 위치를 얻는다.
SetWindowPlacement : 윈도우가 보여지는 상태와 정상(복귀된), 최소, 최대화된 윈도우의 위치를 설정한다.
IsIconic : CWnd가 최소화되었는지를 알아본다.
IsZoomed : CWnd가 최대화되었는지를 알아본다.
MoveWindow : CWnd의 위치또는 크기를 변경한다.
SetWindowPos : 크기, 위치, 순서, 팝업, 최상위 윈도우에 대한 것을 설정한다.
ArrangeIconicWindows : 모든 축소된(아이콘화 된) 자식 윈도우에 대한 것을 설정한다.
BringWindowToTop : CWnd를 오버랩 된 윈도우의 맨 처음으로 보낸다.
GetWindowRect : CWnd의 화면 좌표를 얻는다.
GetClientRect : CWnd 클라이언트 영역의 크기를 얻는다. 


윈도우 참조 관련 함수
ChildWinddowFromPoint : 어떤 자식 윈도우가 특정 점을 포함하고 있는지를 알아낸다.
FindWindow : 윈도우의 이름과 클래스로 확인이 가능한 윈도우의 핸들을 반환한다.
GetNextWindow : 윈도우 관리자의 리스트에서 다음 또는 이전 윈도우를 반환한다.
GetOwner : CWnd의 소유자에 대한 포인터를 얻는다.
SetOwner : CWnd의 소유자를 변경한다.
GetTopWindow : CWnd에 속한 맨 첫 번째 자식 윈도우를 반환한다.
GetWindow : 이 윈도우와 특정한 관계를 가지고 있는 윈도우를 반환한다.
GetLastActivePopup : CWnd이 가지고 있는 팝업 윈도우가 가장 최근에 활성화 되었는지를 알아낸다.
IsChild : CWnd가 자식 윈도우인지 또는 다른 특정 윈도우의 후손인지를 알아낸다.
GetParent : CWnd의 부모 윈도우가 있다면 그 윈도우를 얻는다.
GetSafeOwner : 지정된 윈도우의 소유자를 얻는다.
SetParent : 부모 윈도우를 변경한다.
WindowFromPoint : 특정 점을 포함하는 윈도우를 알아낸다.
GetDlgItem : 특정 대화상자에서 특정 ID의 컨트롤을 얻는다.
GetDlgCtrlID : CWnd가 자식 윈도우이면, 자신의 ID 값을 반환한다.
SetDlgCtrlID : 윈도우에 윈도우 또는 컨트롤의 ID를 설정한다.
GetDescendantWindow : 모든 자식 윈도우를 검색하고 윈도우의 특징 ID를 반환한다.
GetParentFrame : CWnd 객체의 부모 프레임 윈도우를 얻는다.
SendMessageToDescendants : 윈도우의 모든 자식 윈도우에게 메시지를 보낸다.
GetToLevelParent : 윈도우의 최상위 부모를 얻는다.
GetToLevelOwner : 최상위 윈도우를 얻는다.
GetParentOwner : 자식 윈도우의 부모 윈도우에 대한 포인터를 반환한다.
GetTopLevelFrame : 윈도우의 촤상위 프레임 윈도우를 얻는다.
UpdateDialogControls : 대화상자의 버튼이나 다른 컨트롤들의 상태 갱신을 요구한다.
UpdateData : 대화상자의 데이터를 초기화하고 유효화한다.
CenterWindow : 부모 윈도우의 중앙에 윈도우를 위치시킨다. 


갱신/그리기 함수
BeginPaint : 드로잉 작업을 수행하기 위해서 CWnd를 준비한다.
EndPaint : 드로임 작업을 마친다.
Print : 특정 디바이스 컨텍스트에 현재 윈도우를 그린다.
PrintClient : 특정 디바이스 컨텍스트에 모든 윈도우를 그린다.
LockWindowUpdate : 정해진 윈도우에 드로잉을 불가능하도록 하거나 다시 가능하도록 한다.
GetDC : 클라이언트 영역에 표시된 디바이스 컨텍스트를 얻는다.
GetDCEx : 클라이언트 영역에 표시된 디바이스 컨텍스트를 얻고, 그리는 도중에 클리핑이 가능하도록 한다.
RedrawWindow : 클라이언트 영역에서 특정 사각형이나 특정 영역을 갱신한다.
GetWindowDC : 툴바나, 메뉴, 스크롤 바를 포함한 모든 윈도우 영역에 대한 디바이스 컨 텍스트를 얻는다.
ReleaseDC : 클라이언트와 윈도우 디바이스 컨택스트를 해제함으로써, 다른 애플리케이션 이 사용할 수 있도록 한다.
UpdateWindow : 클라이언트 영역을 갱신한다.
SetRedraw : CWnd가 변화된 것을 다시 그리도록 설정하거나, 다시 그릴 수 없도록 설정 하는 역할을 한다.
GetUpdateRect : CWnd의 갱신 영역을 완전히 둘러싸는 가장 작은 사각형의 좌표를 얻는다.
GetUpdateRgn : CWnd의 갱신 영역을 얻는다.
Invalidate : 모든 클라이언트 영역을 무효화한다.
InvalidateRect : 현재의 갱신 영역에 사각형을 추가함으로써 정해진 사각형 내의 클라이언 트 영역을 무효화한다.
InvalidateRgn : 현재의 갱신 영역에 영역을 추가함으로써 정해진 영역내의 클라이언트 영 역을 무효화한다.
VaildateRect : 현재의 갱신 영역에서 사각형을 제거함으로써 정해진 사각형 내의 클라이 언트 영역을 유효화시킨다.
VaildateRgn : 현재의 갱신 영역에 영역을 제거함으로써 정해진 영역 내의 클라이언트 영 역을 유효화시킨다.
ShowWindow : 윈도우를 보이도록 하거나 숨긴다.
IsWindowVisible : 윈도우가 보이는지를 알아낸다.
ShowOwnedPopups : 윈도우가 가지고 있는 모든 팝업 윈도우를 보이게 하거나 숨긴다.
EnableScrollBar : 스크롤 바의 화살표를 사용가능하도록 하거나 불가능하게 한다. 


좌표 매핑 관련 함수
MapWindowPoints : CWnd의 좌표계로부터 다른 윈도우의 좌표계로 지정된 점들을 매핑시 킨다.
ClientToSreen : 클라이언트 좌표계를 화면 좌표계로 변환한다.
ScreenToClient : 화면 좌표계를 클라이언트 좌표계로 변환한다. 


윈도우 텍스트 함수
SetWindowText : 윈도우의 텍스트나 캡션 제목을 지정된 텍스트로 설정한다.
GetWindowText : 윈도우의 텍스트나 캡션 제목을 반환한다.
GetWindowTextLength : 윈도우의 텍스트나 캡션 제목의 길이를 반환한다.
SetFont : 현재의 폰트를 설정한다.
GetFont : 현재의 폰트를 얻는다. 


스크롤 관련 함수
GetScrollPos : 스크롤 박스의 현재 위치를 얻는다.
GetScrollRange : 지정된 스크롤 바에 대한 최소, 최대의 스크롤 바 위치 값을 얻는다.
ScrollWindow : 클라이언트 영역의 내용을 스크롤한다.
ScrollWindowEx : 클라이언트 영역의 내용을 스크롤한다. (ScrollWindow과 비슷)
GetScrollInfo : 스크롤 바에 대한 SCROLLINFO 구조체 값을 얻는다.
GetScrollLimit : 스크롤 바의 한계 값을 얻는다.
SetScrollInfo : 스크롤 바에 대한 정보를 설정한다.
SetScrollPos : 스크롤 박스의 현재 위치를 설정하고, 설정이 되면, 새로운 위치를 나타내 도록 스크롤 바를 다시 그린다.
SetScrollRange : 지정된 스크롤 바에 대한 최소와 최대 위치 값을 지정한다.
ShowScrollBar : 스크롤 바를 보이거나 숨긴다.
EnableScrollBarCtrl : 스크롤 바의 컨트롤을 가능하게 하거나 불가능하도록 한다.
GetScrollBarCtrl : 스크롤 바 컨트롤을 반환한다.
RepositionBars : 클라이언트 영역에 컨트롤 바를 재위치 시킨다. 


드래그-드롭 함수
DragAcceptFiles : 윈도우가 드래그된 파일을 받아들일 것인지를 결정한다. 


Caret 관련 함수
CreateCaret : 시스템 캐럿으로 새로운 형태를 생성하고 캐럿의 소유권을 얻는다.
CreateSolidCaret : 시스템 캐럿으로 솔리드 캐럿을 생성하고 캐럿의 소유권을 얻는다.
CreateGrayCaret : 시스템 캐럿으로 회색 캐럿을 생성하고 캐럿의 소유권을 얻는다.
GetCaretPos : 특정 위치로 캐럿을 이동시킨다.
SetCaretPos : 화면에서 캐럿을 숨긴다.
HideCaret : 캐럿의 현재 위치에서 캐럿을 보이도록 한다.
ShowCaret : 캐럿의 현재 위치에서 캐럿을 보이도록 한다. 일단 캐럿이 화면에 나타나면 캐럿은 자동적으로 깜박거리게 된다. 


대화상자 아이템 관련 함수
CheckDlgButton : 버튼 컨트롤 다음에 체크 표시를 하거나 버튼 컨트롤에서 체크 표시를 제거한다.
CheckRadioButton : 특정 라디오 버튼을 체크하고, 특정 버튼 그룹 내에 있는 모든 다른 라디오 버튼에서 체크 표시를 제거한다.
GetCheckedRadioButton : 버튼 그룹에서 현재 체크된 라디오 버튼의 ID를 반환한다.
DlgDirList : 파일이나 디렉토리에 대한 리스트로 리스트 박스를 채운다.
DlgDirListComboBox : 파일이나 디렉토리에 대한 리스트 콤보 박스를 채운다.
DlgDirSelect : 리스트 박스에서 현재 선택된 항목을 얻는다.
DlgDirSelectComboBox : 콤보 박스에서 현재 선택된 항목을 얻는다.
GetDlgItemInt : 지정된 대화상자에서 컨트롤이 사용하는 텍스트를 정수 값으로 변환한다.
GetDlgItemText : 컨트롤과 관련된 캡션이나 텍스트를 얻는다.
GetNextDlgGroupItem : 컨트롤 그룹 내의 다음 또는 이전 컨트롤을 찾는다.
GetNextDlgTabItem : 특정 컨트롤의 다음 또는 이전 컨트롤 중에서 WS_TABSTOP속성을 가 지는 컨트롤을 얻는다.
IsDlgButtonChecked : 버튼 컨트롤이 체크되었는지를 결정한다.
IsDialogItemMessage : 지정된 메시지가 모달리스(modeless)대화상자를 위한 것인지를 알아 내고, 만약에 그렇다면 그것을 처리한다.
SendDigItemMessage : 특정 컨트롤에 메시지를 보낸다.
SendDigItemInt : 지정된 대화상자에서 컨트롤이 사용하는 텍스트를 정수 값에 해당하는 문 자열로 설정한다.
SendDigItemText : 지정된 대화상자에서 컨트롤의 캡션이나 텍스트를 설정한다.
SubclassDlgItem : CWnd 컨트롤에 윈도우 컨트롤을 추가하고 CWnd의 메시지 맵을 통해 메시지를 배정하도록 한다.
ExecuteDlgInit : 해당 대화상자의 리소스로 초기화한다.
RunModalLoop : 모달 상태에 있는 윈도우의 메시지를 검색하고, 번역하거나, 처리한다.
ContinueModal : 윈도우 모달 상태를 지속시킨다.
EndModalLoop : 윈도우 모달 상태를 마친다. 


메뉴 함수
GetaMenu : 특정 메뉴에 대한 포인터를 얻는다.
SetMenu : 현재의 메뉴를 지정된 메뉴로 설정한다.
DrawMenuBar : 메뉴 바를 다시 그린다.
GetSystemMenu : 애플리케이션이 컨트롤 메뉴를 복사하거사 수정하도록 참조하는 것을 허용한다.
HiliteMenuItem : 최상위 메뉴 아이템에서 선택된 부분을 하이라이트하거나 해제한다. 


툴팁 함수
EnableToolTips : 툴팁 컨트롤을 사용가능하도록 한다.
CancelToolTips : 툴팁 컨트롤을 사용 불가능하도록 한다.
FilterToolTipMessage : 대화상자에서 컨트롤과 관련된 제목이나 텍스트를 얻는다.
OnToolHitTest : 포인터가 특정 도구의 사각형 경계(보통 툴바 영역)안에 있는지를 알아내 고 그 도구에 대한 정보를 얻는다. 


타이머 관련 함수
SetTimer : 시작될 때 WM_TIMER 메시지를 보내는 시스템 타미머를 설치한다.
KillTimer : 타이머를 해제한다. 


경고 함수
FlashWindow : 윈도우를 한 번 반짝이게 한다.
MessageBox : 애플리케이션이 제공하는 캡션과 메시지를가지고 있는 윈도우를 생성하고 화면에 출력한다. 


윈도우 메시지 관련 함수
GetCurrentMessage : 윈도우가 현재 처리하고 있는 메시지의 포인터를 반환한다. OnMessage 류의 메시지 핸들러 멤버 함수 내부에서만 호출되어야한다.
Default : 디폴트 윈도우 프로시저를 호출하며, 이것은 애플리케이션에게 어떤 윈도우 메 시지도 디폴트 형태로 처리하도록 한다.
PreTranslateMessage : TranslateMessage와 DispatchMessage 윈도우 함수에서 처리되기 전 에 윈도우의 메시지를 필터링하기 위해서 CWinApp가 사용한다.
SendMessage : CWnd 객체에 메시지를 보내고 메시지를 처리할 때 까지 반환되지 않는다.
PostMessage : 애플리케이션 큐에 메시지를 위치시키고, 윈도우가 메시지를 처리할 때까 지 기다리지 않고 바로 반환한다.
SendNotifyMessage : 특정 메시지를 윈도우에 보내고 호출한 스래드가 윈도우를 생성했는 지에 따라서, 가능한 빨리 반환한다.


클립보드 관련 함수
ChangeClipboardChain : 클립보드 뷰어의 체인으로부터 CWnd를 제거한다.
SetClientboardViewer : 클립보드의 내용이 변하면 윈도우의 체인에 CWnd를 추가한다.
SetClipboard : 클립보드를 연다. 다른 애플리케이션이 윈도우의 CloseClipboard 함수를 호 출할 때까지 클립보드를 수정하지 않도록 한다.
GetClipboardOwner : 클립보드의 현재 소유자에 대한 포인터를 얻는다.
GetOpenClipboardWindow :현재 클립보드가 열려진 윈도우에 대한 포인터를 얻는다.
GetClipboardViewer : 클립보드 뷰어의 체인에서 처음 윈도우에 대한 포인터를 얻는다. 


OLE 콘트롤
SetProperty : OLE 컨트롤 프로퍼티를 설정한다.
OnAmbientProperty : 환경 프로퍼티 값을 구현한다.
GetControlUnknown : 알려지지 않은 OLE 컨트롤에 대한 포인터를 얻는다.
GetProperty : OLE 컨트롤 프로퍼티를 얻는다.
InvokeaHelper : OLE 컨트롤의 메소드나 프로퍼티를 호출한다. 


오버라이드 가능한 함수
WindowProc : CWnd에 대한 디폴트 프로시저를 제공한다. 디폴트로 메시지 맵을 통해서 메시지를 처리하게 된다.
DefWindowProc : 디폴트 윈도우 프로시저를 요구하며, 이것은 애플리케이션이 처리하지 않은 모든 윈도우 메시지에 대해서 디폴트 처리를 하도록 한다.
PostNcDestroy : 윈도우가 소멸된 후에 디폴트 OnNcDestroy 함수에 의해서 호출되는 가상 함수이다.
OnChildNotify : 컨트롤 통지 메시지를 처리하기 위한 기회를 컨트롤에게 주기 위해서 부 모 윈도우에 의해 호출된다.
DoDateExchange : 대화상자의 데이터 교환이나 유효화 검사를 위해서 UpdateData에 의해 서 호출된다. 


초기화 메시지 핸들러
OnInitMenu : 메뉴가 활성화될 때 호출된다.
OnInitMenuPopup : 팝업 메뉴가 활성화될 때 호출된다. 


시스템 메시지 핸들러
OnSysChar : 사용자가 컨트롤 문자로 변환하기 위해서 호출된다.
OnSysCommand : 사용자가 컨트롤 메뉴에서 항목을 선택하거나, 사용자가 최대화 또는 최 소화 버튼을 누를 때 호출된다.
OnSysDeadChar : 키 입력을 시스템의 Dead 문자((')등이 추가된 문자)로 변환할 때 호출 된다.
OnSysKeyDown : 사용자가 Alt 키를 누르고 다른 키를 누를 때 호출된다.
OnSysKeyUp : 사용자가 Alt 키를 누른 상태로 다른 키를 놓을 때 호출된다.
OnCompacting : 윈도우 시스템에서 시스템 메모리가 부족한 경우에 호출된다.
OnDevModeChange : 사용자가 디바이스의 모드 설정을 바꿀 때 최상위 윈도우가 호출된다.
OnFontChange : 폰트 리소스의 풀이 변할 때 호출된다.
OnPaletteChanged : 애플리케이션이 논리 팔레트를 적용할 것임을 다른 애플리케이션들에 게 알린다.
OnPaletteChanging : 윈도우가 논리 팔레트를 적용할 것임을 다른 애플리케이션들에게 알 린다.
OnSysColorChange : 시스템의 컬러 설정에 변화가 있을 때 최상위 윈도우가 호출한다.
OnWindowPosChanging : SetWindowPos나 다른 윈도우-관리 함수의 호출의 결과로 크기, 위치, 또는 Z-Order가 변하려 할 때 호출된다.
OnWindowPosChanged : SetWindowPos나 다른 윈도우-관리 함수의 호출의 결과로 크기, 위치, 또는 Z-Order가 변했을 때 호출된다.
OnDropFiles : 사용자가 드롭된 파일을 실행하기 위한 프로그램으로 등록된 윈도우 위에서 왼쪽 마우스 버튼을 놓을 때 호출된다.
OnSpoolerStatus : 프린트 관리자의 작업이 추가되거나 삭제될 때마다 프린트 관리자가 호출한다.
OnTimeChange : 시스템 시간 설정이 변경되면 최상위 윈도우가 호출한다.
OnWinIniChange : 윈도우의 초기화 파일인 WIN.INI가 변경되면 최상위 윈도우가 호출한다. 


일반 메시지 핸들러
OnCommand : 사용자가 명령을 선택할 때 호출된다.
OnActivate : CWnd가 활성화되거나 비활성화될 때 호출된다.
OnActivateApp : 애플리케이션이 활성화되려고 하거나 비활성화되려고 하는 경우에 호출 된다.
OnCancelMode : CWnd가 마우스 캡쳐와 같은, 어떤 내부적인 모드를 취소하는 것을 허용 하기 위해서 호출된다.
OnChildActivate : MDI의 자식 윈도우에서 CWnd의 크기나 위치가 변경되거나 CWnd가 활 성화될 때 호출된다.
OnClose : CWnd이 종료되는 신호로서 호출된다.
OnCreat : 윈도우 생성의 일부분으로서 호출된다.
OnCtlColor : 컨트롤이 그려지려 할 때 CWnd가 컨트롤의 부모 윈도우이면 호출된다.
OnDestroy : CWnd가 소멸될 때 호출된다
OnEnable : CWnd가 사용 가능하거나 불가능할 때 호출된다.
OnEndSession : 세션이 종료될 때 호출된다.
OnEnterIdle : 모달 대화상자나 메뉴가 유휴(idle)상태에 들어갈 때 애플리케이션의 메인 윈 도우 프로시저에서 호출된다.
OnEraseBkgnd : 윈도우의 바탕이 지워져야 할 때 호출된다.
OnGetMinMaxInfo : 윈도우가 최대화된 위치나 크기, 또는 최소 또는 최대 트랙킹 크기를 알아야 할 때마다 호출된다.
OnIconEraseBkgnnd : CWnd가 최소화되거나 아이콘이 그려지기 전에 아이콘의 배경을 채 워야 하는 경우에 호출된다.
OnKillFocus : CWnd가 입력포커스를 잃기 전에 호출된다.
OnMenuChar : 사용자가 현재 메뉴에서 이미 정의된 코드와 대응이 안되는 문자를 눌렀을 때 호출된다.
OnMenuSelect : 사용자가 메뉴 아이템을 선택할 때 호출된다.
OnMove : CWnd의 위치가 변경된 후에 호출된다.
OnMoving : 사용자가 CWnd 객체를 이동하고 있음을 나타낸다.
OnDeviceChange : 디바이스나 컴퓨터의 하드웨어 설정이 변경되었음을 알려준다.
OnStyleChanged : ::SetWindowLong 윈도우 함수를 사용하여 하나나 혹은 그 이상의 윈도우 의 스타일이 변했음을 알려준다.
OnStyleChanging : ::SetWindowLong 윈도우 함수를 사용하여 하나나 혹은 그 이상의 윈도 우의 스타일이 변하려 하는 것을 알려준다.
OnPaint : 윈도우의 일부분을 다시 그리기 위해서 호출된다.
OnParentNotify : 자식 윈도우가 생성되거나 소멸될 때, 또는 커서가 자식 윈도우 위에 있 는 동안 마우스 버튼을 클릭하는 경우에 호출된다.
OnQueryDragIcon : 최소화된 CWnd가 사용자에 의해서 드래그될 때 호출된다.
OnQueryEndSession : 사용자가 윈도우의 세션 종료를 선택하는 경우에 호출된다.
OnQueryNewPalette : CWnd가 입력 포커스를 받게됨을 알려준다.
OnQueryOpen : CWnd가 아이콘이거나 사용자가 아이콘이 열려지지기를 요구할 때 호출된다.
OnSetFocus : CWnd가 입력 포커스를 얻은 후에 호출된다.
OnShowWindow : CWnd가 감추어지거나 혹은 보여질 때 호출된다.
OnSize : CWnd의 크기가 변한 후에 호출된다.
OnSizing : 사용자가 사각형의 크기를 다시 조정하고 있음을 나타낸다.
OnStyleChanged : 윈도우의 하나나 혹은 그 이상의 스타일이 변한 것을 나타낸다.
OnStyleChanging : 윈도우의 하나나 혹은 그 이상의 스타일이 변하려 하는 것을 나타낸다. 


컨트롤 메시지 핸들러
OnCharToItem : LBS_WANTKEYBOARDINPUT 스타일을 가지고 있는 리스트 박스에 의해서 WM_CHAR에 대한 응답으로 호출된다.
OnCompareItem : 정렬이 가능한 owner draw 형태의 콤보 박스나 리스트 박스에서 새로운 아이템의 상대 위치를 지정하기 위해서 호출된다.
OnDeleteItem : owner draw 형태의 리스트 박스나 콤보 박스가 소멸되거나 아이템이 컨트 롤에서 제거될 때 호출된다.
OnDrawItem : owner draw 형태의 버튼 컨트롤, 콤보 박스 컨트롤, 리스트 박스 컨트롤이 다시 그려져야 할 때 호출된다.
OnGetDlgCode : 컨트롤이 화살표 키와 Tab 키에 대한 입력을 수행할 수 있도록 하기 위 해서 호출된다.
OnMeasureItem : 컨트롤이 생성될 때 owner draw 형태의 콤보 박스, 리스트 박스, 또는 메뉴 아이템을 요구한다. CWnd는 윈도우에게 컨트롤의 크기를 알려준다.
SendChildNotifyLastMsg : 부모 윈도우가 자식 윈도우에게 통보 메시지를 제공하여 자식 윈도우가 작업을 수행할 수 있도록 한다.
OnWndMsg : 윈도우의 메시지가 핸들링되고 있는 것을 나타낸다.
ReflectLastMsg : 자식 윈도우의 마지막 메시지를 나타낸다.
OnVKeyToItem : WM_KEYDOWN 메시지에 대하여 CWnd가 소유한 리스트 박스가 호출된다. 


입력 메시지 핸들러
OnChar : 키 입력이 시스템 문자가 아닌 문자로 변환될 때 호출된다.
OnDeadChar : 키 입력이 시스템 문자가 아닌 Dead 문자로 변환될 때 호출된다.
OnHSroll : 사용자가 CWnd의 수평 스크롤 바를 클릭하는 경우에 호출된다.
OnKeyDown : 시스템 키가 아닌 키보드가 눌러 졌을 때 호출된다.
OnKeyUp : 시스템 키가 아닌 키보드가 놓을 때 호출된다.
OnLButtonDblClk : 사용자가 왼쪽 버튼을 더블 클릭 했을 때 호출된다.
OnLButtonDown : 사용자가 왼쪽 버튼을 눌렀을 때 호출된다.
OnLButtonUp : 사용자가 왼쪽 버튼을 놓을 때 호출된다.
OnMButtonDblClk : 사용자가 가운데 버튼을 더블 클릭 했을 때 호출된다.
OnMButtonDown : 사용자가 가운데 버튼을 눌렀을 때 호출된다.
OnMButtonUp : 사용자가 가운데 버튼을 놓을 때 호출된다.
OnMouseActivate : 커서가 비활성화된 윈도우에 있고 사용자가 마우스 버튼을 누를 때 호출된다.
OnMouseMove : 마우스커서가 움직일 때 호출된다.
OnRButtonDblClk : 사용자가 오른쪽 버튼을 더블 클릭 했을 때 호출된다.
OnRButtonDown : 사용자가 오른쪽 버튼을 눌렀을 때 호출된다.
OnRButtonUp : 사용자가 오른쪽 버튼을 놓을 때 호출된다.
OnSetCuror : 마우스 입력이 캡쳐되지 않고 마우스가 윈도우에서 커서를 움직이게 하려면 호출된다.
OnTimer : SetTimer에서 정해진 간격마다 호출된다.
OnVScroll : 사용자가 윈도우의 수직 스크롤 바를 클릭할 때 호출된다.
OnCaptureChanged : 마우스 캡쳐를 놓치는 윈도우 메시지를 보낸다. 


비 클라이언트 영역 메시지 핸들러
OnNcActivate : 비 클라이언트 영역이 활성화된 상태인지 비활성화된 상태인지를 가리키 기 위해서 변환이 필요한 경우 호출된다.
OnNcCalcSize : 비 클라이언트 영역의 크기와 위치가 계산될 때 호출된다.
OnNcCreate : 비 클라이언트 영역이 생성될 때 OnCreate 보다 먼저 호출된다.
OnNcDestroy : 비 클라이언트 영역이 소멸될 때 호출된다.
OnNcHitTest : CWnd가 커서를 포함하고 SetCapture로 마우스 입력을 캡쳐할 때 마우스가 움직일 때 마다 윈도우에 의해서 호출된다.
OnNcLButtonDblClk : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 왼쪽 마우스 버튼을 더블 클릭 했을 때 호출된다.
OnNcLButtonDown : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 왼쪽 마우스 버튼을 눌렀을 때 호출된다.
OnNcLButtonUp : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 왼쪽 마우스 버튼을 놓을 때 호출된다.
OnNcMButtonDblClk : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 가운데 마우스 버튼을 더블 클릭 했을 때 호출된다.
OnNcMButtonDown : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 가운데 마우스 버튼을 눌렀을 때 호출된다.
OnNcMButtonUp : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 가운데 마우스 버튼을 놓을 때 호출된다.
OnNcMouseMove : 커서가 CWnd의 비 클라이언트 영역 내에서 이동할 때 호출된다.
OnNcPaint : 비클라이언트 영역이 다시 그려지기를 요구할 때 호출된다.
OnNcRButtonDblClk : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 오른쪽 마우스 버튼을 더블 클릭 했을 때 호출된다.
OnNcRButtonDown : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 오른쪽 마우스 버튼을 눌렀을 때 호출된다.
OnNcRButtonUp : 커서가 CWnd의 비 클라이언트 영역 내에 있는 동안 사용자가 오른쪽 마 우스 버튼을 놓을 때 호출된다. 


MDI 메시지 핸들러
OnMDIActivate : MDI child 윈도우가 활성화되거나 비활성화될 때 호출된다. 


클립보드 메시지 핸들러
OnAskCbFormatName : 클립보드의 소유자가 클립보드의 내용을 나타낼 때 클립보드 뷰어 애플리케이션에 의해서 호출된다.
OnChangeCbChain : 특정 윈도우가 체인에서 제거되었는지를 통지한다.
OnDestroyClipboard : 클립보드가 윈도우 EmptyClipboard 함수의 호출에 의해서 비워지는 경우에 호출된다.
OnDrawClipboard : 문장이 변경되었을 때 호출된다.
OnHScrollClipboard : 클립보드의 소유주가 클립보드의 이미지를 스크롤해야 하고 적절한 섹션을 무효화할 때 호출되며, 스크롤 바의 값들을 갱신한다.
OnPaintClipboard : 클립보드 뷰어의 클라이언트 영역이 다시 그려져야 할 때 호출된다.
OnRenderAllForamts : 소유주 애플리케이션이 파괴되고 있고 모든 포맷들을 다시 만들 필 요가 있을 때 호출된다.
OnSizeClipboard : 클립보드 뷰어 윈도우의 클라이언트 영역의 크기가 변하는 경우에 호출 된다.
OnVSrollClipboard : 소유주가 크립보드 이미지 스크롤해야 하는 경우에 호출되며, 적절한 섹션을 무효화하고, 스크롤바 값들을 갱신한다. 


메뉴 루프 통지
OnEnterMenuLoop : 메뉴의 모달 루프가 수행되는 경우에 호출된다.
OnExitMenuLoop : 메뉴의 모달 루프가 마치는 경우에 호출된다. 
 
 
반응형
BOOL InvalidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase); 
▶hWnd:무효 영역을 설정할 윈도우의 핸들. NULL일 경우 모든 윈도우를 무효화한다.
▶lpRect:무효화할 영역. NULL이면 작업 영역 전체가 무효화된다.
▶bErase:무효 영역의 배경을 먼저 지울 것인가를 지정한다. TRUE이면 BeginPaint 함수가 배경을 먼저 지운 후 작업 영역을 그린다.

설명:WM_PAINT를 직접 호출하지는 않지만 특정 영역을 무효화하여 시스템이 WM_PAINT를 호출
시스템은 무효화 영역을 캐취하면 WM_PAINT를 호출한다. 직접 호출하지 않으니
시스템이 message queue에 있는 다른 메세지를 처리 후 WM_PAINT를 호출하므로 딜레이 발생.
참고: http://www.winapi.co.kr/reference/Function/InvalidateRect.htm

BOOL UpdateWindow(HWND hWnd);
▶ hWnd : 윈도우 핸들
윈도우 프로시저로 WM_PAINT 메시지를 보내 작업영역을 강제로 그리도록 한다.
다른 어떤 메시지보다 WM_PAINT를 먼저 처리해야 할 경우 이 함수를 호출하여 즉시 처리.
(메시지 큐를 통하지 않고 호출하므로 적용이 빠르다.)
작업영역을 완전히 다시 즉시 그리려면 InvalidateRect함수로 작업영역 무효화 후 이 함수 호출
참고: http://www.winapi.co.kr/reference/Function/UpdateWindow.htm
반응형

XP에서 visual studio 2008 을 이용하여 OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid) 실패!!

이거 왜이랫!!  간단한거 사람 또 헤메이게 만든다 ㅡㅡ;; 

디버그 모드에서는 프로세스 핸들을 자알~~ 얻어온다. 빌드하고 실행하면 실패한다.

줴길슨~ 욕 나올수밖에 없다. 이건 뭐 어떻게 문제인지 알수조차 없넹 디버그모드는 되는데

빌드후에 안나온다. ㅡㅡ; 끙끙.. 병이 걸리기 시작한다. 두통이 온다.

MSDN에서 권한 찾아본다. 스샷 짠하고 남겨봅니다.


구글링으로 좀 더 찾아보니 권한 중에 MAXIMUM_ALLOWED 이 있다.

최대한으로 권한을 허락한다는 뜻인거 같은데.. 이걸 사용하니 잘 된다. ㅡㅡ;

OpenProcess(MAXIMUM_ALLOWED,FALSE,pid)    이렇게 하니 잘 됩니다.

관련 자료를 찾아보려 했으나 왜 이렇게 해야 되는지 자세히 나와있는 자료가 없는거 같네요.

오랫만에 C계열 프로그램 해보니 모르는 것도 많고 재밌네요..


  1. 박성철 2009.06.22 05:54

    아......
    정말 이것땜에 세시간 삽질했는데....
    해결했어요 ㅠㅠ
    저 단 한줄로 끝나는데....
    이럴땐 정말 개발자 하기 싫어지네요 ㅠㅠ
    감사해요~

    • Favicon of https://www.pmguda.com BlogIcon Ishaya seon 2009.06.22 09:19 신고

      님도 이것때문에 삽질하다 이글 보시고 허탈한 마음에 글 남기셨군요.. 저도 그랬어요.^^
      도움이 됬다니 다행이에요..^^

  2. 이재희 2009.08.21 13:03

    상수선언을 해줘야 하는거 아닌가요 ㅜㅜ?
    예를 들어 all access 라면 &H1F0FFF 인것처럼요....
    검색해봐도 정보를 얻을수가 없네요 전 ㅡㅜ

    • Favicon of https://www.pmguda.com BlogIcon Ishaya seon 2009.08.23 16:24 신고

      상수선언 안해줘도 됩니다. ^^

    • 이재희 2009.08.28 02:19

      &H2000000
      인가보네요...
      vb6쓰거든요 ^^;;
      binaryworld.net 이란곳에서 찾았네요 ㅎ

    • Favicon of https://www.pmguda.com BlogIcon Ishaya seon 2009.08.28 09:17 신고

      답방 감솨.^^

  3. 은령 2009.09.27 15:16

    맙소사.....
    이거 한줄로 해결됐어.....

    이...이건 억울해서 눈을 감을 수가 없습니다!!!

    • Favicon of https://www.pmguda.com BlogIcon Ishaya seon 2009.09.28 09:03 신고

      이거 때문에 삽질하신 분이 많네요.. 도움이 되었다니 다행이네요.ㅋㅋ

  4. BlogIcon 만족 2010.03.01 18:05

    후.. 저도 해결됬네요.

    이 한줄 때문에 고생을 하다니.. :(

  5. 호호 2011.07.25 18:08

    저도 이것때메 고생하다 알았네요 감사합니다.

    • Favicon of https://www.pmguda.com BlogIcon Ishaya seon 2011.07.26 15:58 신고

      ㅎㅎ 댓글 감사합니다.^^ 블로그 하는 보람은 역시 댓글인가봐요.^^

  6. 행인 2011.08.31 18:29

    감사합니다 ^^

  7. 아.. 2011.10.28 22:20

    전 2일 해맸습니다
    처음부터 코드 다시 다짜보고 ㅋㅋㅋ

    정말 이럴떄 개발하기 싫어지네요 공감입니다 ㅠㅠ
    MSDN 사람 농락하냐!!

  8. 옹예 2013.12.30 20:52

    해결했습니다! 기분좋음.
    근데 둘 차이점이 뭐죠..

반응형
  설명                                                                             스택 프레임                   SP 위치

1. 스택은 현재 초기값(sp) 상태

   이 상태에서 함수호출(CALL nnnn)이 들어오면

 

 ←SP(한칸위를 가리켜야되는데 그림이..)

들어온곳을 가리킴

 

 

 


2. 함수의 인자(두개라고 가정한다.)와 다음 명령어 주소를 차례로 PUSH 한다. 이때 인자의 푸시 순서는는 오른쪽에서 왼쪽으로(FIFO 이므로) 하며 다음 명령어 주소(이것이 복귀 주소이다.)는 IP 에 들어있다.

   그리고 IP를 호출 함수의 시작주소로 변경한다

argument 1

←SP

argument 2

IP(복귀 주소)

 

 

 

 

 


3. IP가 피호출함수의 시작주소로 변경되었으므로 함수가 시작된다. 함수에 진입하면 일단 BP레지스터를 스택에 PUSH한다.(이전 BP를 유지하지 위함. 아래에서 BP 레지스터를 SP를 저장하는 용도로 사용하기 때문에 함수를 여러번 호출할 경우를 대비해 BP를 스택에 넣어두는 것이 필요하다.)

argument 1

←SP

argument 2

IP(복귀 주소)

BP

 

 

 

 


4. 그 뒤 SP를 BP에 옮긴다.(BP=SP). 이것은 함수내에서의 SP 사용으로 SP가 계속 내려가기 때문에 BP를 SP의 저장용도로 사용하기 위함이다.

(이제 PUSH된 BP와 레지스터 BP의 값은 다르다)

 

argument 1

←SP,BP

argument 2

IP(복귀 주소)

BP

 

 

 

 


5. 함수내부에서 스택 사용으로 SP가 증가한다(사용하지 않더라도 상관없다.) 

winapi같은 __stdcall 호출규약을 따르는 프로시저는

사용할 내부변수의 크기를 계산해서

enter x,x 명령어로 sp의 값을 감소시켜준다

(여기선 enter 4,3)

c, c++ 의 __cdecl 호츌규약 프로시저는 수동으로..

argument 1

←BP

←SP

 

argument 2

IP(복귀 주소)

BP

내부변수

내부변수

내부변수

 

 

 


6. 함수에서 복귀를 위해(return) SP를 BP로 되돌린다(SP=BP) 

argument 1

←SP,BP

argument 2

IP(복귀 주소)

BP

내부변수

내부변수

내부변수

 

 

 


7. SP를 되돌렸으면 POP BP를 하여 스택에 저장되어있던 BP를 다시 BP 레지스터에 저장한다.(이로써 함수 호출 이전의 BP 로 돌아온것) 

POP을 했기 때문에 SP가 하나 증가하여 이제 복귀 주소를 가리키고 있다.

argument 1

 

←SP

 

argument 2

IP(복귀 주소)

BP

내부변수

내부변수

내부변수

 

 

 


                                                                                                                     ←SP

8. ret 명령어는 다시 POP IP를 수행한다. 이로써 IP는 저장되어있던 복귀주소 즉 함수호출 CALL nnnn 다음 명령어로 변경된다.

이때 __stdcall을 사용하는 윈도우 프로그램은 ret 뒤의 피연산자로 붙은 4(인자크기 × 인자수)가 SP+4를 수행하여 SP를 4만큼 증가시킨다. (이부분 전체명령어는 ret 4이다. 피호출측에서 스택을 복구 시킨다.)

cdecl을 사용하는 c,c++프로시저는 복귀한뒤에 add, sp+4 를 할 수 있다.(호출측에서 스택을 복구시킨다)

argument 1

 

argument 2

IP(복귀 주소)

BP

내부변수

내부변수

내부변수

 

 

 


                                                                                                                      ←SP

9. 최종적으로 IP는 CALL nnnn의 다음 명령어로 변경되었고 SP또한 함수 호출 이전의 상태로 되돌아 왔다.(스택의 내용을 delete 한 것은 아니지만 스택포인터가 증가되어 앞으로 덮어쓰게 될것이므로 지워진것이나 마찬가지이다.)

argument 1

 

argument 2

IP(복귀 주소)

BP

내부변수

내부변수

내부변수

 

 

 

 32bit 이상 프로세서 에서는 확장 EBP,ESP 등등으로 바뀐다..


winapi 함수는 __stdcall을 쓰며 피호출 함수안에서 스택을 복구 시켜주고 복귀하며

c, c++ 함수는 __cdecl을 쓰며 호출하는 함수에서 피호출함수가 리턴되면 스택을 복구 시킨다.


enter 명령은 (enter n,0)

    push ebp

    mov ebp,esp

    sub esp,n

세개의 명령과 같고


leave명령은

    mov esp,ebp

    pop ebp

명령과 같다.


함수에서 리턴하려면

enter

leave

ret 명령으로 짝을 이루어야 한다.(스택을 피호출 측에서 복구해야 한다면  'ret 매개변수의 총크기')

반응형
HANDLE WINAPI CreateFile(
            LPCTSTR lpFileName, -1
            DWORD dwDesiredAccess, -2
            DWORD dwShareMode, -3
            LPSECURITY_ATTRIBUTES lpSecurityAttributes, -4
            DWORD dwCreationDisposition, -5
            DWORD dwFlagsAndAttributes, -6
            HANDLE hTemplateFile -7
);

1. 개방할 파일 이름을 지정
2. 일기/쓰기 모드를 지정, or(|) 연산으로 결합 가능
   - GENERIC_READ 읽기 모드 지정
   - GENERIC_WRITE 쓰기 모드 지정
3. 파일 공유방식 지정
   - 0 다른 프로세스에 절대 공유 불가, 이미 개방된 파일은 중복 개방 불가
   - FILE_SHARE_READ 다른 프로세스에서 이 파일에 동신 읽기 접근 가능
   - FILE_SHARE_WRITE 다른 프로세스에서 이 파일에 도시 쓰기 접근 가능. 단 동시에 같은 영여에 데이터를 쓰는 문제를 피해야 함.
4. 보안 속성을 지정
5. 파일이 생성되는 방법을 지정
   - CREATE_ALWAYA 항상 새파일을 생성
   - CREATE_NEW 새 파일 생성(같은 이름 존재->실패)
   - OPEN_ALWAYS 기존 파일 개방, 없으면 생성
   - OPEN_EXISTING 기존 파일 개방, 없으면 실패
   - TRUNCATE_EXISTING 기존 파일의 내용 지우고 개방
6. 파일의 특성 정보를 설정, or(|)연산 가능, 기본설정(FILE_ATTRIBUTE_NORMAL)
7. 기존에 존재하는 파일과 동일한 특성을 가지는 새 파일을 만들 때 사용
8. 함수 호출이 성공하면 파일의 핸들 반환.
반응형
HGLOBAL hRe;
char* pText;

hRe=LoadResource(hInst,FindResource(hInst,MAKEINTRESOURCE(IDR_GG2),TEXT("GG")));

pText=(char*)LockResource(hRe);
MessageBox(NULL,pText,"dfd",MB_OK);

FreeResource(hRe);

사용자 리소스를 사용하기 위해서는 리소스 타입를 Custom...에서 이름을 지정해주어야 한다

본인은 위체서 처럼 "GG"라는 이름으로 타입을 지정했다.

리소스를 사용하기 위해서는 일단 해당 리소스를 찾고 로딩하고.. 사용하게 된다.

HRSRC hResc=FindResource(hInst,MAKEINTRESOURCE(IDR_GG2),TEXT("GG"));

는 리소스를 찾는 과정으로 반환값은 HRSRC라는 이름의 핸들러다. 이때 필요한 정보는 인스턴스, 리소스 ID와 소속 타입...(실제론 모든 리소스를 접근하는 표준 방법임)

찾는후에 로딩하는 과정은

HGLOBAL hRe=LoadResource(hInst,hResc);

위와 같이 로딩을 한후에 실제로 사용하기 위해서는 LockResource와 FreeResource를 사용해서 메모리에 실제적으로 적재하거나 해제하는 작업을 시행한다.

char* pText=(char*)LockResource(hRe);
MessageBox(NULL,pText,"dfd",MB_OK);

FreeResource(hRe);

결국 LockResource를 호출하게 되면 해당 데이타에 대한 포인터를 반환하면 적당히 원하는 타입으로 변경하면 된다. 위의 경우엔 char* 로 했다.

사용후에는 hRe를  FreeResource해주면 된다.


OS에서는 메모리가 부족하면 자동으로 리소스 부분을 메모리에서 제거한다. 즉 필요할때 로딩을 언제든지 할수 있으며, 리소스는 메모리 문제로 인해서 제거될수 있는 유동적인 존재다.


따라서 실제 로딩을 하는 것은 LockResource이며 없다면 다시 로딩을 시행할 것이다. 있다면 존재하는 녀석을 반환하게 될 것이다.


FreeResource는 메모리에서 완벽한 제거가 아니라, 메모리가 부족하면 언제든지 메모리에서 제거될수 있다는 것을 부여한다고 보면 되겠다.
-----------------------------------------------------------------------------------------------------

HRSRC FindResource( HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType)


hModule:리소스를 가진 모듈 핸들

lpName:리소스 이름

lpType:리소스 타입


리턴:리소스 핸들 리턴 

ex)FindResource( g_hInstance,MAKEINTRESOURCE(IDR_SPR_TML),"TML" );



숫자로 정의된 리소스 이름을 문자열 형태로 바꿔주는 매크로 ex)MAKEINTRESOURCE(IDR_SPR_TML)  

-------------------------------------------------------------------------------------
SizeofResource 함수는 지정된 리소스의 바이트 단위 크기를 반환한다.

DWORD SizeofResource(
  HMODULE hModule, // resource-module handle
HRSRC hResInfo // resource handle );

Parameters

hModule
그 리소스를 포함하고 있는 실행가능한 파일의 모듈에 대한 핸들
hResInfo
리소스의 핸들. 이 핸들은 FindResource 나 FindResourceEx 함수를 사용해서 생성되어야만 한다.

Return Values

만약 함수가 성공하면 반환값은 리소스의 바이트 숫자 크기이다.

만약 실패하면 반환값은 0이다. 확장된 에러 정보를 원하면 GetLastError을 호출하라.

QuickInfo

  Windows NT: Requires version 3.1 or later.
  Windows: Requires Windows 95 or later.
  Windows CE: Requires version 1.0 or later.
  Header: Declared in winbase.h.
  Import Library: Use kernel32.lib.
-------------------------------------------------------------------------------------

HGLOBAL LoadResource(HMODULE hModule, HRSRC hResInfo);
hModule: 해당 모듈 핸들
hResInfo : 잀을 리소스 핸들
리턴: 16비트 호환성을 위해 HCLOBAL핸들을 리턴하자민 이 핸들은 
실제로 전역 메모리
핸들이 아닌 단순한 핸들이다,
이렇게 읽은 리소스의 포인터를 얻으려면 LockResource()함수를
써야함...

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

LockResource 함수는 지정된 리소스를 메모리에서 잠근다

LPVOID LockResource(
  HGLOBAL hResData   // handle to resource to lock
);
 

Parameters

hResData
잠겨질 리소스의 핸들. LoadResource 함수는 이 핸들을 리턴한다

Return Values

만약 로드된 리소스가 잠기면, 반환값은 리소스의 첫번째 바이트의 포인터이다.
그렇지 않으면 NULL

Remarks

FindeResource 나 FindResourceEX 함수에 의해 반환된 핸들을 사용함으로써
리소스를 잠그려고 시도하면 동작하지 않을 것이다.
당신은 정확하지 않거나 불규칙한 데이터를 가리키는 값을 얻게 될 것이다.

accelerator table, bitmap, cursor, icon, menu 등의 사용을 끝내고
다음 표에 있는 함수 중 하나를 호출해 관련 메모리를 해제할 수 있다.

ResourceRelease function
Accelerator tableDestroyAcceleratorTable
BitmapDeleteObject
CursorDestroyCursor
IconDestroyIcon
MenuDestroyMenu

그것들을 생성한 프로세스가 종료 될 때 시스템은 이들
리소스를 자동으로 제거하지만, 적절한 함수를 호출하는 것은
메모리를 보호하고, 프로세스의 작업량을 줄여준다.

QuickInfo

  Windows NT: Requires version 3.1 or later.
  Windows: Requires Windows 95 or later.
  Windows CE: Requires version 1.0 or later.
  Header: Declared in winbase.h.
  Import Library: Use kernel32.lib.

반응형

특정 디렉토리 아래에 있는 모든 파일과 디렉토리 혹은 특정 조건의 파일과 디렉토리를 얻고자 한다면, 다음 API 함수를 이용한다.

HANDLE FindFirstFile(LPCSTR lpFileName, LPWIN32_FIND_DATA finddata);
BOOL FindNextFile(HANDLE hFind, LPWIN32_FIND_DATA finddata);
BOOL FindClose(HANDLE hFind);


FindFirstFile : 파일 검색을 시작한다.
파일 검색 문자열이 잘못되었거나 다른 이유로 함수 실행이 실패했을 경우 INVALID_HANDLE_VALUE로 Define된 상수값을 반환한다. 성공했을 경우 파일 검색 핸들을 반환하고 두 번째로 전달되는 구조체에 첫 번째로 발견되는 파일의 정보를 넣어준다.

LPCSTR lpFileName
파일 검색 문자열을 넘겨준다.
예) "c:\*.*" 혹은 "c:\*.txt"

LPWIN32_FIND_DATA finddata
파일 검색 데이터 구조체의 포인터를 넘겨준다.


FindNextFile : 다음 파일의 정보를 얻는다.
함수 실행이 성공하였을 경우 TRUE를, 실패하였을 경우 FALSE를 반환한다. 함수 성공시 두 번째 인자로 전해지는 구조체에 파일의 정보를 넣어준다.

HANDLE hFind
FindFirstFile이 반환한 파일 검색 핸들을 넘겨준다.

LPWIN32_FIND_DATA finddata
파일 검색 데이터 구조체의 포인터를 넘겨준다.

FileClose
: 파일 핸들을 닫는다.
FindFirstFile에 의해 열린 파일 핸들을 닫는다. 성공하였을 경우 TRUE를, 실패하였을 경우 FALSE를 반환한다.
HANDLE hFind
FindFirstFile이 반환한 파일 검색 핸들을 넘겨준다.


 실제 사용 예는 다음과 같다.

Windows 디렉토리의 모든 파일 및 폴더 출력 (Language : c)
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.     WIN32_FIND_DATA FindData;
  8.     HANDLE hFind;
  9.     char path[255];
  10.  
  11.     strcpy(path, "c:\\windows\\*");
  12.    
  13.     hFind = FindFirstFile((LPCSTR)path, &FindData);
  14.     if(hFind==INVALID_HANDLE_VALUE)
  15.         return 0;
  16.    
  17.     do
  18.     {
  19.         printf ("%s\n", FindData.cFileName);
  20.     }while(FindNextFile(hFind, &FindData));
  21.  
  22.     FindClose(hFind);
  23.  
  24.     return 0;
  25. }


(2003/2005)LPCSTR 캐스팅에 문제가 있는 경우 Project -> Properties -> Configuration Properties -> General -> Character Set을 Not Set으로 설정하기 바랍니다.

+ Recent posts