天天看點

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執行控制菜單對前面表格中描述的預定義動作的請求。

在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

繼續閱讀