windows消息-WM_SYSCOMMAND与WM_COMMAND

1、WM_SYSCOMMAND

OnSysCommand()这个函数主要是截获控制命令的,msdn上的解释如下:

The framework calls this member function when the user selects a command from the Control menu, or when the user selects the Maximize or the Minimize button.

对于Windows菜单中菜单项和加速键(加速键指跨界按钮?),点击后,Windows会向所属的窗体发送WM_SYSCOMMAND,而不是WM_COMMAND消息。

注意:WINDOWS菜单是系统菜单,也就是在标题栏点击鼠标左键的时候弹出的菜单。尤其是最大化和最小化窗口的时候,比如现在软件的流行的点关闭按钮,不是退出而是隐藏的情况,就可以在这里来实现。

参考:https://blog.csdn.net/autumn20080101/article/details/7577619

https://blog.csdn.net/gxj1680/article/details/3549656

原型:afx_msg void OnSysCommand( UINT nID, LPARAM lParam ),参数:

nID 指定了请求的系统命令的类型。这个参数可以是下列值之一:
SC_CLOSE 关闭CWnd对象。
SC_HOTKEY 激活与应用程序指定的热键相关的CWnd对象。lParam的低位字标识了要激活的窗口的HWND句柄。
SC_HSCROLL 水平滚动。
SC_KEYMENU 通过击键获得菜单。
SC_MAXIMIZE (或SC_ZOOM) 最大化CWnd对象。
SC_MINIMIZE (或SC_ICON) 最小化CWnd对象。
SC_MOUSEMENU 通过鼠标点击获得菜单。
SC_MOVE 移动CWnd对象。
SC_NEXTWINDOW 移动到下一个窗口。
SC_PREVWINDOW 移动到前一个窗口。
SC_RESTORE 将窗口恢复为普通的位置和大小。
SC_SCREENSAVE 执行SYSTEM.INI文件中[boot]部分指定的屏幕保护应用程序。
SC_SIZE 调整CWnd对象的大小。
SC_TASKLIST 执行或激活Windows的任务管理器应用程序。
SC_VSCROLL 垂直滚动。
lParam 如果控制菜单是通过鼠标选择的,则lParam中包含了光标的位置。低位字包含了x轴坐标,高位字包含了y轴坐标;否则这个参数没有使用。
· SC_HOTKEY 激活与应用程序指定的热键相关的窗口。lParam的低位字标识了要激活的窗口。
· SC_SCREENSAVE 在控制面板的桌面部分执行屏幕保护应用程序。

说明:

当用户从控制菜单选择了一个命令,或者用户选择了最大化户最小化按钮时,框架调用这个函数。

在缺省情况下,OnSysCommand执行控制菜单对前面表格中描述的预定义动作的请求。

扫描二维码关注公众号,回复: 3217365 查看本文章

在WM_SYSCOMMAND消息中,nID参数的低四位被Windows内部使用。当应用程序测试nID的值时,它必须用位与操作符AND将值0xFFF0与nID的值组合在一起以获得正确的结果。

为选择控制菜单中的项的加速键(快捷方式)被转换为OnSysCommand调用;所有其它的加速键被转换为WM_COMMAND消息。

参考:https://blog.csdn.net/trustnature/article/details/7793905

2、WM_COMMAND

WM_COMMAND产生的条件:点击菜单, 点击加速键,点击子窗口按钮,点击工具栏按钮。这些时候都有command消息产生。

WM_COMMAND消息中有两个参 数,wparam、lparam,定义如下:

       wParam 高两个字节 通知码

       wParam 低两字节 命令ID

       lParam 发送命令消息的子窗体句柄。

对于菜单和加速键来说,lParam为0,只有控件此项才非0。命令ID也就是资源脚本中定义的菜单项的命令ID或者加速键的命令ID;菜单的通知码为0;加速键的通知码为1。

参考:https://www.cnblogs.com/qq78292959/p/3564340.html

当用户点击菜单、按钮、下拉列表框等控件时候,会触发WM_COMMAND

LOWORD(wParam) 是控件或菜单或加速键的ID,菜单的sparator的ID为0

如果LOWORD(wParam) 是控件ID,HIWORD(wParam)是notification code, 比如BN_CLICKED, BN_DBLCLK等,标志用户对控件的操作,双击,单击之类。

如果LOWORD(wParam) 是菜单ID,HIWORD(wParam)是0。

如果LOWORD(wParam) 是加速符ID,HIWORD(wParam)是1。

如果LOWORD(wParam) 是控件ID,lParam是控件的句柄值,否则为NULL。其实,GetDlgItem(hWnd, LOWORD(wParam)) == lParam。

Notification Code的命名规律:

列表框:   LBN_*****   

组合框:   CBN_****

Tab框:    TBN_****

按钮:     BN_*****

Edit :        EN_*****

参考:https://blog.csdn.net/qihuanfengyun/article/details/37545723

猜你喜欢

转载自blog.csdn.net/qq_16334327/article/details/81952256