I couldn't get this to work with WM_CHAR. For some reason, it returned VK_CANCEL, so not exactly what I was expecting.
Well, WM_CHAR returns Unicode characters, not vkeys. I'm not sure if there's a problem with interpreting \x03 here, but either way, WM_KEYDOWN is probably more correct.
Note also that vkeys are not case sensitive, and 'c' is VK_NUMPAD3.
I'm not really interest if we missing ctrl being released before the C.
I'm... not sure why not? That's a common sequence of events when pressing Ctrl+C, and it works correctly on Windows.