Я нашел ответ. Дочерние окна главного окна должны быть разделены на подклассы, чтобы сообщения WM_COMMAND, генерируемые ускорителями клавиатуры, могли быть перехвачены и переданы в родительское окно.
Это включает изменение оконной процедуры элемента управления на другую. Альтернативная процедура обрабатывает сообщения, которые должны быть перехвачены, отправляя их в родительское окно. Указатель на исходную оконную процедуру также должен храниться где-то, чтобы элемент управления мог функционировать правильно.
Процедуру окна можно изменить, используя SetWindowLongPtr с GWLP_WNDPROC.
Вот простой пример того, как сделать это путем сохранения указателя на исходную оконную процедуру в значении пользовательских данных элемента управления (GWLP_USERDATA):
Код для изменения процедуры окна и сохранения исходной процедуры в GWLP_USERDATA:
SetWindowLongPtr( hWnd, GWLP_USERDATA, ( LONG_PTR )SetWindowLongPtr( hWnd, GWLP_WNDPROC, ( LONG_PTR )WndProc ) );
Процедура перехватывающего окна:
static LRESULT CALLBACK WndProc( const HWND hWnd, const UINT message, const WPARAM wParam, const LPARAM lParam )
{
switch( message )
{
case WM_COMMAND:
SendMessage( GetParent( hWnd ), message, wParam, lParam );
return 0;
default:
//Assume that GWLP_USERDATA has been set to the original window procedure.
return CallWindowProc( ( WNDPROC )GetWindowLongPtr( hWnd, GWLP_USERDATA ), hWnd, message, wParam, lParam );
}
}