这些字元讯息是我们将文字传递给视窗讯息处理程式时遇到的第一个讯息。它们不是唯一的讯息,其他讯息伴随以0结尾的整个字串。视窗讯息处理程式是如何知道该字元是8位元的ANSI字元还是16位元的Unicode宽字元呢?很简单:任何与您用RegisterClassA(RegisterClass的ANSI版)注册的视窗类别相联系的视窗讯息处理程式,都会获得含有ANSI字元代码的讯息。如果视窗讯息处理程式用RegisterClassW(RegisterClass的宽字元版)注册,那么传递给视窗讯息处理程式的讯息就带有Unicode字元代码。如果程式用RegisterClass注册视窗类别,那么在UNICODE识别字被定义时就呼叫RegisterClassW,否则呼叫RegisterClassA。
除非在程式写作的时候混合了ANSI和Unicode的函式与视窗讯息处理程式,用WM_CHAR讯息(及其他三种字元讯息)说明的字元代码将是:
同一个视窗讯息处理程式可能会用到两个视窗类别,一个用RegisterClassA注册,而另一个用RegisterClassW注册。也就是说,视窗讯息处理程式可能会获得一些ANSI字元代码讯息和一些Unicode字元代码讯息。如果您的视窗讯息处理程式需要晓得目前视窗是否处理Unicode讯息,则它可以呼叫:
如果hwnd的视窗讯息处理程式获得Unicode讯息,那么变数fUnicode将为TRUE,这表示视窗是用RegisterClassW注册的视窗类别。
讯息顺序
因为TranslateMessage函式从WM_KEYDOWN和WM_SYSKEYDOWN讯息产生了字元讯息,所以字元讯息是夹在按键讯息之间传递给视窗讯息处理程式的。例如,如果Caps Lock未打开,而使用者按下再释放A键,则视窗讯息处理程式将接收到如表6-10所示的三个讯息:
如果您按下Shift键,再按下A键,然後释放