4.WM_SIZE
#define WM_SIZE 0X0005 • 1
- 产生时间:当窗口大小改变后
- 附加信息:
- wParam:请求的大小调整类型
- lParam:
- LOWORD:变化后的宽度
- HIWORD:变化后的高度
- 返回值:如果应用程序处理此消息,它返回0。
- 一般用法:常用于窗口大小变化后,调整窗口内各个部分的布局
我们来到回调函数中处理WM_SIZE消息:
LRESULT CALLBACK WindowProc( IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { char output[256] = { 0 }; switch (uMsg) { //常见消息 case WM_DESTROY: { sprintf(output, TEXT("窗口即将被销毁,将向消息队列中发送WM_QUIT消息")); WriteConsole(g_hOUTPUT,output,strlen(output), 0, 0); PostMessage(NULL, WM_QUIT, 0, 0); break; } case WM_SYSCOMMAND:{ sprintf(output, TEXT("检测到WM_COMMAND消息,将弹出提示窗口\n")); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); MessageBox(hwnd, "记住我!!!", "别忘了", MB_YESNO); break; } case WM_CREATE: { sprintf(output, TEXT("检测到WM_CREATE消息,将创建窗口。\n")); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); break; } case WM_SIZE: { sprintf(output, "iParam:窗口宽变化为:%d,窗口高变化为:%d \n", HIWORD(lParam), LOWORD(lParam)); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); break; } } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
效果图:
5.WM_QUIT
#define WM_QUIT 0X0012 • 1
- 产生时间:指示终止应用程序的请求,并在应用程序调用PostQuitMessage函数时生成,此消息导致GetMessage函数返回0。
- 附加信息:
- wParam:PostQuitMessage函数传递的参数(PostQuitMessage函数中给定的退出代码)
- lParam:未使用
- 一般用法:用于结束消息循环,当GetMessage函数抓到这个消息后,会返回FALSE,结束while循环。
我们来到回调函数中处理这个消息:
五.键盘消息
1.键盘消息分类
- WM_KEYDOWN----键盘被按下时产生
- WM_KEYUP----键盘被放开时产生
- WM_SYSKEYDOWN----系统键被按下时产生
- WM_SYSKEYUP----系统键被放开时产生
- 附加信息:
- wParam:按键的虚拟键码
- lParam:按键的参数,例如按下多少次
- wParam:输入字符的ASCII字符编码码值
- lParam:按键的相关参数
这里我给出一段伪代码,帮助大家理解GetMessage函数抓到字符消息后,TranslateMessage函数翻译此消息的过程:
TranslateMessage(&Msg){ if(Msg.message != WM_KEYDOWN){ return ; }else{ 根据Msg.wParam(键码值)可以获知哪个按键被按下 if(不可见字符){ return; } 查看Capslock键是否处于打开状态 if(打开){ PostMessage(Msg.hwnd,WM_CHAR,......); }else{ PostMessage(Msg.hwnd,WM_CHAR,......); } }
我们来到回调函数中来看看键盘消息:
LRESULT CALLBACK WindowProc( IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { char output[256] = { 0 }; switch (uMsg) { //常见消息 case WM_QUIT: { MessageBox(hwnd, "确定退出程序吗?", "退出", MB_YESNO); break; } case WM_DESTROY: { sprintf(output, TEXT("窗口即将被销毁,将向消息队列中发送WM_QUIT消息")); WriteConsole(g_hOUTPUT,output,strlen(output), 0, 0); PostMessage(NULL, WM_QUIT, 0, 0); break; } case WM_SYSCOMMAND: { sprintf(output, TEXT("检测到WM_COMMAND消息,将弹出提示窗口\n")); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); MessageBox(hwnd, "记住我!!!", "别忘了", MB_YESNO); break; } case WM_CREATE: { sprintf(output, TEXT("检测到WM_CREATE消息,将创建窗口。\n")); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); break; } case WM_SIZE: { sprintf(output, "lParam:窗口宽变化为:%d,窗口高变化为:%d \n", HIWORD(lParam), LOWORD(lParam)); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); break; } //键盘消息 case WM_KEYDOWN: { sprintf(output, "检测到WM_KEYDOWN消息,键码值:%d.\n", wParam); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); break; } case WM_KEYUP: { sprintf(output, "检测到WM_KEYUP消息,键码值:%d.该按键被放开\n", wParam); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); break; } } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
我们来看看效果:
我们不难发现,每个键位都有一个专属的键码值,而且我们发现,大写和小写的键码值一样,是通过TranslateMessage函数来检测CapsLock是否打开区分大小写的。