I've had the problem, it appears WM_THEMECHANGED is only sent when changing from "having a theme" to "having no theme". As you probably want to call CloseThemeData and attempt to open a new theme (assuming there is one) I just do that in WM_SYSCOLORCHANGE and don't bother with the theme message, WM_SYSCOLORCHANGE is also sent when the theme changes.