Yes, you are right. Just subclass to a new wndproc, it should be safe, sample code:
LRESULT CALLBACK MenuButton::WndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam )
{
TRACE("menubutton::wndproc message = %x, wparam = %x\n", message, wparam);
if (message == WM_KEYDOWN && wparam == VK_LEFT) {
MenuButton* prev = dynamic_cast<menubutton*>(prevWidget());
if (prev) {
cancelMenu(Widget::hwnd());
fnNativePoint pt(1,1);
prev->clientToNativePt(pt);
PostMessage(Widget::hwnd(), WM_LBUTTONDOWN, 0, MAKELPARAM(pt.x, pt.y));
return 0;
}
return 0;
} else if (message == WM_KEYDOWN && wparam == VK_RIGHT) {
MenuButton* next = dynamic_cast<menubutton*>(nextWidget());
if (next) {
cancelMenu(Widget::hwnd());
fnNativePoint pt(1,1);
next->clientToNativePt(pt);
PostMessage(Widget::hwnd(), WM_LBUTTONDOWN, 0, MAKELPARAM(pt.x, pt.y));
return 0;
}
}
return CallWindowProc(prevWndProc_, hwnd, message, wparam, lparam);
}
In above I simulate the next/prev feature of window's default menu bar. cancelMenu(hwnd) send WM_CANCELMODE to parent window.