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