Какое сообщение заставляет кнопку отправить сообщение 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 может указателем на объект-оболочку кнопки

Другие вопросы по тегам