J'ai trouvé la réponse. Les fenêtres enfants de la fenêtre principale doivent être sous-classées afin que les messages WM_COMMAND générés par les raccourcis clavier puissent être interceptés et transmis à la fenêtre parente.
Cela implique de changer la procédure de la fenêtre de la commande à une autre. La procédure alternative gère les messages qui doivent être interceptés en les envoyant à la fenêtre parente. Un pointeur vers la procédure de fenêtre d'origine doit également être stocké quelque part afin que le contrôle puisse fonctionner correctement.
La procédure de fenêtre peut être modifiée en utilisant SetWindowLongPtr avec GWLP_WNDPROC.
Voici un exemple simple de la façon de le faire en stockant un pointeur vers la procédure de fenêtre d'origine de la valeur des données utilisateur du contrôle (GWLP_USERDATA):
Le code pour changer la procédure de fenêtre et stocker la procédure originale GWLP_USERDATA:
SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)WndProc));
La procédure de fenêtre d'interception:
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);
}
}