zoukankan      html  css  js  c++  java
  • 零基础逆向工程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 一个完整的消息流程

  • 相关阅读:
    Dubbo服务提供者Provider启动流程下(四)
    修改超链接的默认格式
    给 3Com 3C940 Gigabit LOM 安装Windows Server 2008 驱动
    Express版SQL定时备份BAK文件(SQL2005,SQL2008)
    DataGridView的行、列调整
    更新DNS缓存
    VB.Net类型转换——全角半角间转换(StrConv)
    VB.Net 获取或者转换时间不受系统时间格式影响
    Active Desktop
    VB.Net类型转换——全角半角间转换(StrConv)
  • 原文地址:https://www.cnblogs.com/flatcc/p/7683979.html
Copyright © 2011-2022 走看看