加密与解密学习笔记4-Windows消息机制
windows是一个消息(Message)驱动式系统,windows消息提供应用程序与应用程序之间、应用程序与windows系统间进行通信的手段。应用程序实现的功能由消息来触发,并且靠对消息的响应和处理来完成。
Windows系统有2种消息队列:
1、系统消息队列
2、应用程序消息队列
计算机说有输入设备有Windows监控,
一个事件发生,需经过如下过程:
1、Windows现将输入的消息放入系统消息队列
2、再将输入的消息拷贝到相应的应用程序队列
3、应用程序中的消息循环从它的消息队列中检索每个消息并且发送给相应的窗口函数中
注意:消息的非抢先性,不论事件的急与缓,总共是按照到达的先后排队(一些系统消息除外),造成外部实时事件可能得不到及时处理。
Windows本身由消息驱动,所以调试程序时跟踪一个消息会得到相当底层的答案。
Windows消息函数
1、SendMessage函数
调用一个窗口的函数,将一条消息发送给那个窗口,除非消息处理完毕,否则该函数不会返回
LRESULT SendMessage(
HWND hWnd, //目的窗口的句柄
UINT Msg, //消息标识符
WPARAM wParam, //消息的WPARAM域
LPARAM lParam); //消息的LPARAM域
返回值:由具体的消息决定
2、PostMessage函数
将消息投递到指定窗口的消息队列。投递的消息会在Windows时间处理过程中处理,会随同投递的消息调用指定的窗口于的窗口函数,适合不需要立即处理的窗口消息发送。
BOOL PostMessage(
HWND hWnd, //目的窗口的句柄
UINT Msg, //消息标识符
WPARAM wParam, //消息的WPARAM域
LPARAM lParam //消息的LPARAM域
);
返回值:如消息投递成功,则返回TRUE(非零)
3、WM_COMMAND函数
当用户从菜单或按钮中选择一条命令或者一个控件时发送给它的父窗口,或者当一个快捷键被释放时发送。(WM_COMMAND产生的条件:点击菜单, 点击加速键,点击子窗口按钮,点击工具栏按钮。这些时候都有command消息产生。)Visual C++的WINUSER.H文件里定义了WM_COMMAND消息对应的十六进制是0x0111。
WM_COMMAND
wNotifyCode = HIWORD(wParam); //通告代码
wID = LOWORD(wParam); //菜单条目、控件或快捷键的标识符
hwndCtl = (HWND)lParam; //控件句柄
返回值:如果应用程序处理这条消息,返回值为零
4、WM_DESTROY消息
当一个窗口被破坏时发送。WM_DESTROY消息的十六进制是0x0002
这条消息无参数
返回值:如果应用程序处理这条消息,返回值为零
5、WM_GETTEXT消息
应用程序发送一条WM_GETTEXT消息,拷贝一个对应窗口的文本到一个呼叫程序提供的缓冲区。WM_GETTEXT消息的十六进制是0x000D
WM_GETTEXT
wParam=(WPARAM)cchTextMax; //需要拷贝的字符数
lParam=(LPARAM)lpszText; //接收文本的缓冲区地址
返回值:被拷贝的字符数
6、WM_LBUTTONDOWN消息
当光标在一个窗口的客户区并且用户按下鼠标左键,WM_LBUTTONDOWN消息被发送。如果鼠标动作未被捕获,这条消息发送给光标下的窗口;否则,被发送给已经捕获鼠标动作的窗口。WM_LBUTTONDOWN消息消息的十六进制是0x0201
WM_LBUTTONDOWN
fwKeys=wParam; //key旗标
xPos=LOWORD(lParam); //光标的水平位置
yPos=HIWORD(lParam); //光标的垂直位置
返回值:如果应用程序处理这条消息,返回值为零
7、WM_LBUTTONUP消息
当光标在一个窗口的客户区并且用户按下鼠标左键,WM_LBUTTONUP消息被发送。如果鼠标动作未被捕获,这条消息发送给光标下的窗口;否则,被发送给已经捕获鼠标动作的窗口。WM_LBUTTONUP消息消息的十六进制是0x0202
WM_LBUTTONUP
fwKeys=wParam; //key旗标
xPos=LOWORD(lParam); //光标的水平位置
yPos=HIWORD(lParam); //光标的垂直位置
返回值:如果应用程序处理这条消息,返回值为零
8、WM_QUIT消息
当应用程序调用PostQuitMessage函数时,生成消息WM_QUIT;
WM_QUIT消息的十六进制是0x0012
WM_QUIT
nExitCode=(int)wParam; //退出代码
返回值:这条消息没有返回值