Какое сообщение заставляет кнопку отправить сообщение WM_COMMAND
Я знаю, что при нажатии кнопки посылается сообщение WM_COMMAND его родителю, но какое сообщение он получает, что заставляет его отправить это сообщение? Я переопределяю WndProc кнопки по умолчанию для кнопки, и кнопка не получает сообщение WM_COMMAND, поэтому мне нужно знать, какое сообщение вызывает кнопку для отправки сообщения WM_COMMAND, чтобы я мог воспроизвести эту функцию.
4 ответа
Я обнаружил, что на самом деле это комбинация WM_LBUTTONDOWN, WM_MOUSELEAVE и нескольких других вещей. Например, WM_COMMAND будет срабатывать только в том случае, если мышь была нажата на кнопке, и все еще находится на кнопке, когда срабатывает WM_LBUTTONUP. Что касается пробела, ввода и т. Д., Я считаю, что он просто обрабатывает сообщение VK_ENTER и прочее.
Кажется, я вспомнил, что это WM_LBUTTONUP, но воспользуйтесь шпионской программой, чтобы узнать наверняка.
Невозможно переопределить WM_COMMAND
сообщение, потому что WM_LBUTTONDOWN
сообщение конвертируется как WM_COMMAND
сообщение и отправить его на родительский контроль. Это механизм, который делается в фоновом режиме.
Вы спросили о пробеле и введите ключ. Это можно контролировать с помощью виртуальных кодов клавиш, таких как vk_enter
, vk_tab
...так далее.,
Сообщение 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 может указателем на объект-оболочку кнопки