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

1 第一个图形界面程序

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


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


步骤3:在新的cpp文件中添加:#include <Windows.h>

并添加入口函数:

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
",wParam,lParam);
			CREATESTRUCT* createst = (CREATESTRUCT*)lParam;
			DbgPrintf("CREATESTRUCT %s
",createst->lpszClass);

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

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

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

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

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

			return 0;
		}
		//鼠标消息
	case WM_LBUTTONDOWN:
		{
			DbgPrintf("WM_LBUTTONDOWN %d %d
",wParam,lParam);
			POINTS points = MAKEPOINTS(lParam);
			DbgPrintf("WM_LBUTTONDOWN %d %d
",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 一个完整的消息流程

原文地址:https://www.cnblogs.com/flatcc/p/7683979.html