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