Какое сообщение заставляет кнопку отправлять сообщение WM_COMMAND

Я знаю, что кнопка при нажатии отправляет сообщение WM_COMMAND своему родителю, но какое сообщение она получает, что заставляет ее отправить это сообщение? Я переопределяю WndProc по умолчанию для кнопки, и кнопка не получает сообщение WM_COMMAND, поэтому мне нужно знать, какое сообщение заставляет кнопку отправлять сообщение WM_COMMAND, чтобы я мог воспроизвести эту функцию.


person John Zane    schedule 20.12.2010    source источник


Ответы (4)


Я обнаружил, что на самом деле это комбинация WM_LBUTTONDOWN, WM_MOUSELEAVE и некоторых других вещей. Например, WM_COMMAND будет запущена только в том случае, если мышь была нажата на кнопку, и все еще находится на кнопке, когда запущена WM_LBUTTONUP. Что касается пробела, ввода и т. д., я считаю, что он просто обрабатывает сообщение VK_ENTER и прочее.

person John Zane    schedule 20.12.2010
comment
Вы можете вызвать старый WndProc для кнопки в любых сообщениях, которые вы явно не хотите перехватывать. (Насколько я помню, я думаю, что это GetWindowLongPtr(hWnd,GWL_WNDPROC), чтобы получить его...) Это должно заставить вашу новую кнопку отправлять сообщение WM_COMMAND как обычно, позволяя вам подключиться, чтобы делать все, что вы пытаетесь сделать. Не могу сказать, хорошо ли это для вашей ситуации, хотя... - person ; 21.12.2010
comment
@brone нет, это не так, мне нужно иметь возможность определить, была ли кнопка действительно нажата (в соответствии с правилами кнопки), кроме исходного WndProc, чтобы я мог делать свои собственные вещи. Захват WM_COMMAND в родительском окне - это не то, что мне нужно. - person John Zane; 21.12.2010

Кажется, я помню, что это WM_LBUTTONUP, но используйте программу-шпион, чтобы узнать наверняка.

person 500 - Internal Server Error    schedule 20.12.2010
comment
А если нажать на него пробелом? Или клавиша Enter? Или с клавишей акселератора? - person David Heffernan; 21.12.2010

Сообщение WM_COMMAND всегда принимается родительским элементом управления. Если вы хотите нажать кнопку программно, вы можете сделать это:

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

LPARAM WM_COMMAND содержит button_handle. Таким образом, вы можете извлечь информацию о вызове кнопки

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

Вы должны были установить эту информацию ранее, как это

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

например, some_info может по указателю на объект-оболочку кнопки

person ilyagoo    schedule 29.06.2012

Невозможно переопределить сообщение WM_COMMAND, поскольку сообщение WM_LBUTTONDOWN преобразуется в сообщение WM_COMMAND и отправляется в родительский контроль. Это механизм, который выполняется в фоновом режиме.

Вы спросили о пробеле и введите ключ. Это можно контролировать с помощью виртуальных кодов клавиш, таких как vk_enter, vk_tab... и т. д.,

person karthik    schedule 18.02.2011