0.说明
观看滴水逆向视频总结(部分截图来自于滴水课件)
编译器:vc++6.0
编写语言:c
欢迎大家留言交流😃^ __ ^
1.win32事件和消息
2.系统处理消息
1.用户产生消息,该消息进入系统的消息队列
2.所有的应用程序也存在一个队列,该队列挨个读取消息队列。
3.如果一个应用程序检测到这个消息是自己的,就处理该消息,如果不是,就不管,继续循环读取队列中下一个消息。
4.如果一个消息所有应用都不处理,就由系统处理,这个函数DefWindowProc(hwnd , uMsg, wParam, lParam);//例如在桌面任意点击一下。
3.win32创建窗口和消息处理
创建win32应用程序
(以下好多win32api可以通过MSDN文档查询)(或微软官网查询)
//步骤9:回调函数(消息处理函数)
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);
}
4.源代码
编译环境:vc++6.0
// c.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include<windows.h>
HINSTANCE hAppInstance;
LRESULT CALLBACK WindowProc(
IN HWND hwnd,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam
);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// hAppInstance = hInstance;
//窗口的类名
PSTR className = "My First Window";
//创建窗口类的对象
WNDCLASS wndclass = {0};//必须所有值赋初值
wndclass.hbrBackground = (HBRUSH)COLOR_MENU;//窗口的背景色
wndclass.hCursor = LoadCursor(NULL , IDC_APPSTARTING);
wndclass.lpfnWndProc = WindowProc;//窗口过程函数
wndclass.lpszClassName = className;//窗口名
wndclass.hInstance = hInstance;//定义窗口类的应用程序的实例句柄
//注册窗口类
RegisterClass(&wndclass);
//创建窗口
HWND hwnd = CreateWindow(
className, //类名
"My first window!", //窗口标题
WS_OVERLAPPEDWINDOW, //窗口外观样式
400, //相对于父窗口的x坐标
200, //相对于父窗口的y坐标
1000, //窗口的宽度
600, //窗口的高度
NULL, //父窗口句柄,为NULL
NULL, //菜单句柄,为NULL
hInstance, //当前应用程序的句柄
NULL //附件数据一般为NULL
);
if(hwnd == NULL)//是否创建成功
return 0;
//显示窗口
ShowWindow(hwnd , SW_SHOW);
//更新窗口
UpdateWindow(hwnd);
//消息循环
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) )
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息
}
return 0;
}
//回调函数
LRESULT CALLBACK WindowProc(
IN HWND hwnd,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam)
{
if(uMsg == WM_DESTROY)//对应销毁(关闭)窗口的消息
{
PostQuitMessage(0);//关闭程序。
return 0;//处理完消息后要返回0。
}
return DefWindowProc(hwnd , uMsg, wParam, lParam);//自己不要的消息发给系统处理
}
欢迎大家留言交流^ _ ^