消息

发送消息函数

SendMessage(); //
PostMessage(); //

消息

WM_CREATE : 窗口创建时的消息, 可以做一些初始化的操作, 一般我们在响应 WM_CREATE 消息时设置字体等初始化信息,注意这些变量应该设置为 static 类型,因为我们会在今后的不同消息中使用它们, lParam 指向 CREATESTRUCT 的结构体(LPCREATESTRUCT), 可以从该结构体中取出窗口句柄
WM_PAITNT : 重绘消息, 通过 Invalidate() 和 UpdateWindow() 等可以手动发送队列或非队列消息, 只会绘制无效区域
WM_DESTORY : 调用了DestroyWindow()之后, 默认PostQuitMessage(0) 发送 WM_QUIT 消息
WM_CLOSE : 用户点下关闭按钮时, 此时可以选择是否继续关闭窗口, 如果关闭, 可以调用DestroyWindow(), 该函数会发送 WM_DESTROY 的消息
WM_QUIT : 退出
WM_SIZE : 改变主窗口客户区大小时触发该消息 LOWROD(lParam), HIGHWORD(lParam), wParam 指出窗口的新状态
WM_MOVE : 当窗口相对于屏幕的坐标变化时,触发该消息
WM_SETFOCUS : 正在获得输入焦点
WM_KILLFOCUS : 正在失去输入焦点
SETTINGCHANGE : 当修改一些系统设置时,会触发该消息
WM_COMMAND : 相应子窗口控件消息

滚动条消息

WM_VSCROLL(垂直):
WM_HSCROLL(水平):

鼠标消息

流程:
确定鼠标消息的窗口,发送WM_NCHITTEST来确定到底是哪个部分(客户区/非客户区),确定参数,发送具体消息
只要有鼠标在窗口上经过/操作,都会有鼠标消息,不管有没有焦点、是否活跃等
GetSystemMetrics(SM_MOUSEPRESENT); // 判断是否连接鼠标, 如果鼠标已经被安装,返回非零, 否则返回零
GetSystemMetricx(SM_CMOUSEBUTTONS); // 判断鼠标按钮的个数
GetCursorPos(); // 获取鼠标光标的位置, 屏幕坐标
SetCursorPos(); // 设置鼠标光标的位置
ShowCursor(); // 显示光标
KillCursor(); // 隐藏光标
<> MAKELONG(); // 将两个个16位整数合并为32位无符号整数
lParam : 鼠标坐标信息
LOWORD() HIWORD()
GET_X_LPARAM() GET_Y_LPARAM() // 在多显示器下也好用
wParam : 表示鼠标按钮、shift键、Ctrl键等的状态
case WM_LBUTTONDOWN:
if (wParam & MK_SHIFT)
{
if (wParam & MK_CONTROL)
{
MessageBox(NULL, TEXT("Control and Shift"), NULL, MB_OK);
}
}
客户区
WM_MOUSEMOVE : 鼠标移动, 当处理完一个鼠标移动消息时, 才会放入下一个, 并不是每移动一次都产生消息
WM_LBUTTONDOWN : 客户区左键按下消息
WM_RBUTTONDOWN : 客户区右键按下消息
WM_LBUTTONUP : 客户区右键抬起消息
WM_RBUTTONUP : 客户区左键抬起消息
// 当触发 WM_LBUTTONUP 消息时,该消息的 wParam 参数如果为 MK_RBUTTON 时,说明此时鼠标右键也被按下。
WM_LBUTTONDBLCIK : 左键双击
WM_MBUTTONDBLCIK : 中键双击
WM_RBUTTONDBLCIK : 右键双击
非客户区
lParam : 坐标 (使用屏幕坐标)
ScreenToClient(); // 转换坐标
ClientToScreen(); // 转换坐标
wParam : 用于表示非客户区鼠标移动或单击的位置 HT
WM_NCLBUTTONDOWN : 非客户区左键按下消息
WM_NCRBUTTONDOWN : 非客户区右键按下消息
WM_NCLBUTTONUP : 非客户区右键抬起消息
WM_NCRBUTTONUP : 非客户区左键抬起消息
WM_NCMOUSEMOVE :
WM_NCLBUTTONDBLCIK :
WM_NCMBUTTONDBLCIK :
WM_NCRBUTTONDBLCIK :
击中测试消息:
lParam : 坐标
wParam : 没用
WM_NCHITTEST : 优先级高于所有鼠标消息
鼠标滚轮消息
WM_MOUSEWHEEL :
lParam : 鼠标位置, 屏幕坐标
wParam : 低位表示一些按键的按下状态, 高位表示滚轮滚动的距离
GET_WHEEL_DELTA_WPARAM(); // 获取高位
WHEEL_DELTA : 滚动的距离是它的倍数
systemParametersInfo(); // SPI_SETWHEELSCROLLLINES 设置鼠标滚轮每次滚动的行数, SPI_GETWHEELSCROLLLINES
SETTINGCHANGE : 当修改一些系统设置时,会触发该消息
触发该消息时, 应该获取最新的滚轮设置
热点:鼠标指针指向的像素点 hot spot
单击
双击
需要在给窗口类赋值时加上 CS_CBLCLKS 风格
消息顺序是:单击消息--->双击消息
否则会产生两个单击的消息
拖动
LBUTTON、MBUTTON、RBUTTON

键盘消息

虚拟键代码:wParam, 对应的是 Ascii 或Unicode 字符码
IsWindowUnicode(); // 判断指定的窗口是否是Unicode
lParam : 查看文档
击键消息
WM_KEYDOWN
WM_KEYUP
WM_SYSKEYDOWN
WM_SYSKEYUP
当收到一个虚拟键消息时,TranslateMessage() 会将消息翻译成字符(如果是可以显示的字符), 并发送字符消息
字符消息
WM_CHAR
WM_DEADCHAR : 死键, 当字符需要符号时
WM_SYSCHAR
WM_SYSDEADCHAR
GetKeyNameText(); //
GetKeyState(); // 尽量使用消息处理
GetAsyncKeyState(); //