零基础逆向工程28_Win32_02_事件_消息_消息处理函数

1 第一个图形界面程序

步骤1:创建Windows应用程序  选择空项目


步骤2:在新建项窗口中选C++代码文件 创建一个新的cpp文件


步骤3:在新的cpp文件中添加:#include 

并添加入口函数:

int CALLBACK WinMain(                       CALLBACK 是一个宏
    _In_  HINSTANCE hInstance,                      #define CALLBACK    __stdcall
    _In_  HINSTANCE hPrevInstance,
    _In_  LPSTR lpCmdLine,
    _In_  int nCmdShow
    )                   所有的Win32     API函数都遵循该约定
{

    return 0;
}

步骤4:设计窗口类

代码:

//窗口的类名
TCHAR className[] = "My First Window";

// 创建窗口类的对象
WNDCLASS wndclass = {0};                        //一定要先将所有值赋值
wndclass.hbrBackground = (HBRUSH)COLOR_MENU;                        //窗口的背景色
wndclass.lpfnWndProc = WindowProc;                      //窗口过程函数
wndclass.lpszClassName = className;                     //窗口类的名字
wndclass.hInstance = hInstance;                     //定义窗口类的应用程序的实例句柄


步骤5:注册窗口类

RegisterClass(&wndclass);


步骤6:创建窗口

// 创建窗口
HWND hwnd = CreateWindow(
    className,              //类名
    TEXT("我的第一个窗口"),                //窗口标题
    WS_OVERLAPPEDWINDOW,                //窗口外观样式
    10,             //相对于父窗口的X坐标
    10,             //相对于父窗口的Y坐标
    600,                //窗口的宽度
    300,                //窗口的高度
    NULL,               //父窗口句柄,为NULL
    NULL,               //菜单句柄,为NULL
    hInstance,              //当前应用程序的句柄
    NULL);              //附加数据一般为NULL

if(hwnd == NULL)                    //是否创建成功
    return 0;


步骤7:显示窗口

// 显示窗口
ShowWindow(hwnd, SW_SHOW);

步骤8:消息循环

MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}


步骤9:回调函数

/*
窗口消息处理程序 窗口回调函数:

1、窗口回调函数处理过的消息,必须传回0.

2、窗口回调不处理的消息,由DefWindowProc来处理.
*/

LRESULT CALLBACK WindowProc(
                            IN  HWND hwnd,
                            IN  UINT uMsg,
                            IN  WPARAM wParam,
                            IN  LPARAM lParam
                            )
{
    switch(uMsg)
    {
        //窗口消息
    case WM_CREATE:
        {
            DbgPrintf("WM_CREATE %d %d\n",wParam,lParam);
            CREATESTRUCT* createst = (CREATESTRUCT*)lParam;
            DbgPrintf("CREATESTRUCT %s\n",createst->lpszClass);

            return 0;
        }
    case WM_MOVE:
        {
            DbgPrintf("WM_MOVE %d %d\n",wParam,lParam);
            POINTS points = MAKEPOINTS(lParam);
            DbgPrintf("X Y %d %d\n",points.x,points.y);

            return 0;
        }
    case WM_SIZE:
        {
            DbgPrintf("WM_SIZE %d %d\n",wParam,lParam);
            int newWidth  = (int)(short) LOWORD(lParam);
            int newHeight  = (int)(short) HIWORD(lParam);
            DbgPrintf("WM_SIZE %d %d\n",newWidth,newHeight);

            return 0;
        }
    case WM_DESTROY:
        {
            DbgPrintf("WM_DESTROY %d %d\n",wParam,lParam);
            PostQuitMessage(0);

            return 0;
        }
        //键盘消息
    case WM_KEYUP:
        {
            DbgPrintf("WM_KEYUP %d %d\n",wParam,lParam);

            return 0;
        }
    case WM_KEYDOWN:
        {
            DbgPrintf("WM_KEYDOWN %d %d\n",wParam,lParam);

            return 0;
        }
        //鼠标消息
    case WM_LBUTTONDOWN:
        {
            DbgPrintf("WM_LBUTTONDOWN %d %d\n",wParam,lParam);
            POINTS points = MAKEPOINTS(lParam);
            DbgPrintf("WM_LBUTTONDOWN %d %d\n",points.x,points.y);

            return 0;
        }
    }
    return DefWindowProc(hwnd,uMsg,wParam,lParam);
}

2 什么是事件?什么是消息?

"动作"即是事件,消息是对事件的具体描述。

Windows为了能够准确的描述这些信息,提供了一个结构体:MSG,该结构体里面记录的事件的详细信息.

typedef struct tagMSG {
  HWND   hwnd;
  UINT   message;
  WPARAM wParam;
  LPARAM lParam;
  DWORD  time;
  POINT  pt;
} MSG, *PMSG;

说明:

1、hwnd:窗口句柄
表示消息所属的窗口
一个消息一般都是与某个窗口相关联的
在Windows中 HWND类型的变量通常用来标识窗口。

2、message:消息类型
在Windows中,消息是由一个数值来表示的
但是由于数值不便于记忆,所以Windows将消息对应的数值定义为WM_XXX宏(WM == Window Message)
鼠标左键按下 WM_LBUTTONDOWN 键盘按下 WM_KEYDOWN

3、wParam 和 lParam
32位消息的特定附加信息,具体表示什么处决于message

4、time
消息创建时的时间

5、消息创建时的鼠标位置

3 什么是窗口进程

LRESULT CALLBACK WindowProc(
    IN  HWND hwnd,
    IN  UINT uMsg,
    IN  WPARAM wParam,
    IN  LPARAM lParam
    );

4 一个完整的消息流程

零基础逆向工程28_Win32_02_事件_消息_消息处理函数_第1张图片

你可能感兴趣的:(零基础逆向工程28_Win32_02_事件_消息_消息处理函数)