我找到了答案。主窗口的子窗口必须是子类的,这样键盘加速器产生的 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 );
}
}