Какое сообщение заставляет кнопку отправить сообщение WM_COMMAND - PullRequest
4 голосов
/ 21 декабря 2010

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

Ответы [ 4 ]

3 голосов
/ 21 декабря 2010

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

0 голосов
/ 29 июня 2012

Сообщение 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 может указателем на объект-оболочку кнопки

0 голосов
/ 18 февраля 2011

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

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

0 голосов
/ 21 декабря 2010

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

...