+ -
当前位置:首页 → 问答吧 → 关于清单方块类别的 WM_COMMAND消息

关于清单方块类别的 WM_COMMAND消息

时间:2011-12-22

来源:互联网

今天发现一个奇怪的问题,创建了两个listbox类控件,点击其中一个会产生两个WM_COMMAND消息。

只创建一个listbox类控件时,第一次点击也会产生两个WM_COMMAND消息。如果加入SetFocus的话就正常(一个listbox类控件)

代码如下,无关代码都去掉了:
C/C++ code
case WM_CREATE:
                              hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
                               cxChar=LOWORD(GetDialogBaseUnits());
                               cyChar=HIWORD(GetDialogBaseUnits());
                               
               hwndYear=CreateWindow(TEXT("listbox"),NULL,
                               WS_CHILD|WS_VISIBLE|LBS_STANDARD,
                               cxChar,cyChar*3,
                               cxChar*8,
                               cyChar*2,
                               hwnd,(HMENU)ID_YEAR,
                               hInstance,
                               NULL);
                               
                               hwndMonth=CreateWindow(TEXT("listbox"),NULL,
                               WS_CHILD|WS_VISIBLE|LBS_STANDARD|LBS_SORT,
                               cxChar,cyChar*10,
                               cxChar*8+GetSystemMetrics(SM_CXVSCROLL),
                               cyChar*2,
                               hwnd,(HMENU)ID_MONTH,
                               hInstance,
                               NULL);
                               
                               return 0;

        case  WM_COMMAND:
                              
                                                          ++count;
                                                            return 0;


实在想不出什么原因,望高手指点一二

作者: selooloo   发布时间: 2011-12-22

从MSDN中查询的一些通知或消息有一些是在WM_COMMAND的附属参数中的,例如BN_CLICKED通知,它触发WM_COMMAND消息,wParam的high-order字节中。因此我猜测WM_COMMAND是一些消息的集合,你在点击的时候触发了多个使用WM_COMMAND作为消息载体的通知或事件。你将截获的两次WM_COMMAND;

针对你的操作,我特意创建了一个ListBox和一个Edit,将Edit设置为默认焦点,点击LilstBox的时候触发了WM_COMMAND消息两次;
两个控件的定义如下
C/C++ code

#define IDC_LIST1                       1003
#define IDC_EDIT1                       1004



我截获这两次消息
C/C++ code

if (uMsg==WM_COMMAND)   
{
    TRACE("\r\n%d,%d,%d",HIWORD(wParam),LOWORD(wParam),lParam);
}



请看debug输出结果是
512,1004,593732111
4,1003,198386111
很明显,触发的两次WM_COMMAND消息分别是来自控件ID为1004和1003的两个控件;也就说明在焦点切换的时候Edit和Listbox分别触发了WM_COMMAND消息。

作者: chayedanwc   发布时间: 2011-12-24

一次 是killFocus
一次 是 Onclick

作者: shen_wei   发布时间: 2011-12-24