Silly question, but do you have _UNICODE and UNICODE defined? If you don't, TCHAR will equate to char..... and: TCHAR t = 0x01FF; SendMessage(WM_CHAR, (WPARAM)t, NULL); Will truncate t to 0xFF when stored in a char varible. Try being explicte about what character set you are sending - wchar_t t = 0x01FF; SendMessage(WM_CHAR, (WPARAM)t, NULL);