Poedu_Windows_Windows消息机制

__stdcall

由调用方完成压栈操作,由被调用方自身在返回前清空,Win32中使用的是这个

__cdecl

参数由调用方完成压栈及平栈操作,每一个调用它的函数都包含有清空堆栈的代码,C语言中使用的这个

__fdecl

不用栈进行参数传递,用的是寄存器,所以速度很快

HINSTANCE

实例对象,通过操作HINSTANCE操作进程

WinMain函数

作为win32程序的入口函数三种

tWinMain

可变版本,根据编码自动转换

WinMain

ANSI版本

wWinMain

Unicode版本

WinMain和wWinMain的区别在于,传入的一个参数不一样(LPSTR或LPWSTR)

wWinMain原型

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)

参数

HINSTANCE hInstance

当前进程的句柄

需要由外部传入的原因:进程是系统创建的,程序本身并不能创建进程,所以需要外部传入

Main中没有,是因为Main是C语言里的一个系统,C语言出的时候,还没有Instance这个参数,它还能运行,但是需要用GetInstance才能调用win32的东,WinMain在调用的时候跟Main函数的时候是一样的

HINSTANCE hPrevInstance

hPrevInstance:是哪个进程启动我的

LPWSTR lpCmdLine

和外部进行交互

这个参数在不同的WinMain版本下是不一样的,在ANSI版本中是LPSTR

int nCmdShow

nCmdShow:和外部进行交互

第一、二个参数,是系统告诉我的,第三、四两个参数是用户告诉我的

RegisterClassExW

Ex:升级版本,不建议使用RegisterClass了

进行了一个内容升级:WINDCLASSEX*lpwcx

做了一个窗口填充,结构体原型

typedef struct tagWNDCLASSEXW {
UINT cbSize;
/* Win 3.x */
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
/* Win 4.0 */
HICON hIconSm;
} WNDCLASSEXW, *PWNDCLASSEXW, NEAR *NPWNDCLASSEXW, FAR *LPWNDCLASSEXW;

cbsize:是一个高危参数

但凡是出现了cbsize,都必须进行填充,不然交互的时候就会产生问题:因为用户态和和心态传递参数的时候,是非常费劲的,只能传入一个从哪个地方开始的指针,而在共享区域读多少空间,需要cbsize这个参数来告知,如果这个参数没填,那么理所当然的会出问题,cbsize承担了一个“示宽”的作用

lpfnWndProc

lp:long point
fn:函数
Proc:过程,步骤
对窗口进行一些操作的时候会调用这个函数

cbClsExtra

需要附带的信息,一般很少用到

hInstance

属于哪个实例

hIcon

图标

hCrusor

光标

lpszClassName

当前窗口类的名称,是使用这个类的唯一标识符,所以这个窗口类名应该是唯一的

InitInstance

参数中的nCmdShow这个参数一定要进行判断,不然隐藏窗口什么的会没法响应

在这个函数中,才正式CreateWindow了

Windows消息机制

硬件没法直接操作软件,因为有一堵墙,核心态没法传到用户态

核心态接受到硬件的信号后,会把这个消息写到内存共享区。用户态会一直扫描共享区

消息响应机制是在Win32子系统中实现的,因为内核要求精简,所以在内核中不会对消息进行翻译(比如鼠标右键的地方不
一样,所响应的消息也不一样,这就需要进行翻译),会把这个消息写到共享区

Win32会帮每个应用程序建立消息队列,会对消息进行派发

通过焦点判断是在哪个窗口,然后把消息派发给指定的窗口

通过GetMessage来获取消息,搭配while达到一直获取消息的目的

消息队列不会出现满的情况,因为前面一直在走,只存在优先级的说法

MSG结构体

hwnd

窗口句柄

UINT message

消息值, UINT类型

消息数值化

lParam、wParam

附加消息

当通过message不能完全清楚的时候,就要依靠附加消息

time

时间, 消息发生时间

pt

当前消息创建时,鼠标所在窗口的位置

通过 GetMessage API来取 当前应用程序的消息队列的 消息
通过 DispatchMessage API来触发 WndProc回调

WndProc(窗口过程)

在WndProc中处理窗口的各种消息

消息分类

窗口消息
命令消息
控件通知消息

里面消息非常非常多,接近本质,但是开发难度大,所以微软就写了一套框架:MFC,MFC归根结底就是对WIN32消息进行了封装,封装到了一个个的类里面,再对消息进行路由,到需要响应的函数里

MFC中,所调用的所有函数都是MFC的函数,与win32下的函数有点不一样(比如MFC下的MessageBox和Win32下的MessageBox的参数有点不一样),区分是Win32函数还是MFC中的函数的方法:

MessageBox() ->这个是类里的,也就是MFC里的
::MessageBox() ->这个是全局的,也就是Win32的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值