因为自己的工作,接触VC++的机会不多,所以对Windows消息处理机制不是很熟。
这天,刚好需要一个功能,伪装发送一个Button Clicked的消息。之后就百度啊,CSDN啊,现在来总结下。
Windows操作系统中包括以下几种消息:
1、标准Windows消息:
除WM_COMMAND之外,所有以WM_开头的消息都是标准消息。从CWnd派生的类,都可以接收到这类消息。
2、命令消息
来自菜单,加速键或工具栏按钮的消息。这类消息都以WM_COMMAND形式呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。从CCmdTarget派生的类,都可以接收到这类消息。
3、通知消息
由控件产生的消息。这类消息也是以WM_COMMAND、WM_NOTIFY等形式呈现,从CCmdTarget派生的类,都可以接收到这类消息。
这些控件包括:按钮(Button)、组合框(ComboBox)、编辑框(TextBox)、列表框(ListBox)、ListView控件、Treeview控件、工具条(Toolbar)、菜单(Menu)等。
WM_COMMAND和WM_NOTIFY消息都是WINDOWS CONTROL给它的父窗体发的消息,那这两种消息有什么不同呢?WM_COMMAND消息其实是早期的(WIN3.X时代)子窗体消息,子窗体给父窗体发送消息,父窗体就捕获WM_COMMAND来处理子窗体的消息。但是这个消息只包括了有限的信息,例如wParam包括了子窗口ID和通知码,lParam则包括了子窗口句柄,就这点信息了,如果想知道一些额外的信息的话(例如,鼠标点在了子控件的位置)就要借助于其他的WM_*消息。所以对于新型的WIN32控件,微软就增加了一个新的WM_NOTIFY消息,这个消息的参数是这样的:wParam包含了控件ID,而lParam则包含了一个结构体的指针,这个结构体是NMHDR结构或者以NMHDR结构为第一项的一个更大的结构体。这样就可以包含了很多的子控件想给父窗体提供的信息了,甚至可以自己去定义这种的结构体。
4、自定义消息
我需要发送的是Button的BN_CLICKED消息,是WM_COMMAND中的一种消息。根据MSDN描述,Code应该是这样的:
::PostMessage(m_hWnd, WM_COMMAND, MAKEWPARAM(idBtn1, BN_CLICKED), (LPARAM)(hwndButton1)); //m_hWnd为父窗口的Handle, 因为是在父窗口的代码中处理消息队列