2010-12-20 38 views
4

我知道一个按钮,当点击时,发送WM_COMMAND消息给它的父,但它收到什么信息,使它发送此消息?我重写了按钮的默认WndProc,并且该按钮没有收到WM_COMMAND消息,所以我需要知道什么消息导致按钮发送WM_COMMAND消息,以便我可以复制该功能。什么消息导致一个按钮发送一个WM_COMMAND消息

回答

3

我发现它实际上是WM_LBUTTONDOWN,WM_MOUSELEAVE和其他一些东西的组合。例如,只有鼠标在按钮上被按下时,WM_COMMAND才会被触发,并且当WM_LBUTTONUP被触发时,WM_COMMAND仍然在按钮上。至于空间,输入等,我相信它只是处理VK_ENTER消息和东西。

+0

你可以调用旧的WndProc作为任何你不明确想要陷阱的消息的按钮。 (从内存中,我认为它是'GetWindowLongPtr(hWnd,GWL_WNDPROC)'来检索它...)这应该让你的新按钮发送正常的WM_COMMAND消息,同时让你挂钩做任何你想要的做。真的不知道这是否对你的情况有好处,虽然... – 2010-12-21 00:22:02

+0

@brone不,它不是,我需要能够分辨按钮是否真正“按下”(根据按钮的规则),除了原WndProc,所以我可以做我自己的东西。在父窗口中捕获WM_COMMAND并不是我所需要的。 – 2010-12-21 00:28:33

0

我似乎记得它是WM_LBUTTONUP,但使用间谍程序找出肯定。

+1

什么,当你的信息用空格键点击它?或者回车键?或者用加速键? – 2010-12-20 22:41:04

0

无法覆盖WM_COMMAND消息,因为WM_LBUTTONDOWN消息被转换为WM_COMMAND消息并将其发送给父控件。这是在后台完成的机制。

你问到的空间,进入key.This可以通过虚拟键代码像vk_entervk_tab控制...等,

0

WM_COMMAND消息总是被控制父节点接收。如果要以编程方式单击按钮,可以执行以下操作:

::SendMessage(button_handle, BM_CLICK, 0, 0); 

WM_COMMAND的LPARAM包含button_handle。所以,你可以提取你按钮调用

::GetWindowLongPtr(HWND(lParam), GWL_USERDATA); 

您必须已设置此信息前面这样

::SetWindowLongPtr(button_handle, GWL_USERDATA, reinterpret_cast<LONG_PTR>(some_info)); 

例如some_info可以通过指针按钮包装对象