메시지 크래커 (Message cracker) 사용하기

설명

Win32 API를 이용하여 프로그램을 작성할때 윈도우메시지 하나하나를 처리해주려면 상당히 신경쓸 부분이 많아지게 됩니다.

우선 WPARAM과 LPARAM의 값이 무엇을 담고 있는지도 봐야하구, 메시지가 어떻게 넘어오고, 처리되는지 등등...

상당히 수동적이라 자세하게 건드릴 수 있지만 그만큼 짜증나기도 합니다.

이럴때 메시지 크래커를 사용하면 그런 수고로움을 조금은 덜 수 있습니다.

사용법

windowsx.h 파일을 include하고, windowsx.h 파일을 열어서 문자열 찾기로 해당 메시지를 찾습니다.

WM_CREATE 이런식으로 찾으면 매크로 함수 위에 주석으로 함수의 프로토타입이 제공되어져 있는걸 확인할 수 있습니다.

그걸 그냥 복사해서 붙여넣으시고, 함수 정의 해서 사용하시면 됩니다.

윈도우 프로시저 안에는 아래와 같은 HANDLE_MSG() 메크로를 이용하면 됩니다.


#include <windows.h>
#include <windowsx.h>
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam ,LPARAM lParam);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("Class");
 
BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);
void OnPaint(HWND hWnd);
void OnDestroy(HWND hWnd);
 
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
      ,LPSTR lpszCmdParam,int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst=hInstance;
 
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hInstance=hInstance;
    WndClass.lpfnWndProc=WndProc;
    WndClass.lpszClassName=lpszClass;
    WndClass.lpszMenuName=NULL;
    WndClass.style=CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&WndClass);
 
    hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
        NULL,(HMENU)NULL,hInstance,NULL);
    ShowWindow(hWnd,nCmdShow);
 
    while (GetMessage(&Message,NULL,0,0)) {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return (int)Message.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    switch (iMessage) {
        HANDLE_MSG(hWnd, WM_CREATE, OnCreate);
        HANDLE_MSG(hWnd, WM_PAINT, OnPaint);
        HANDLE_MSG(hWnd, WM_DESTROY, OnDestroy);
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
 
BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
    hWndMain=hWnd;
    return TRUE;
}
 
void OnPaint(HWND hWnd)
{
    HDC hdc;
    PAINTSTRUCT ps;
    hdc=BeginPaint(hWnd, &ps);
    EndPaint(hWnd, &ps);
}
 
void OnDestroy(HWND hWnd)
{
    PostQuitMessage(0);
}
메시지 크래커 (Message cracker) 사용하기 메시지 크래커 (Message cracker) 사용하기 Reviewed by Tae-seob Shin on 9월 30, 2018 Rating: 5

댓글 없음:

Powered by Blogger.