R) (iType TEXT (" ") : szKeyName), (TCHAR) (iType pmsg[i].wParam : ' '), LOWORD (pmsg[i].lParam), HIWORD (pmsg[i].lParam) & 0xFF, 0x01000000 & pmsg[i].lParam szYes : szNo, 0x20000000 & pmsg[i].lParam szYes : szNo, 0x40000000 & pmsg[i].lParam szDown : szUp, 0x80000000 & pmsg[i].lParam szUp : szDown)) ; } EndPaint (hwnd, &ps) ; return 0 ;
case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
KEYVIEW1显示视窗讯息处理程式接收到的每次按键和字元讯息的内容,并将这些讯息储存在一个MSG结构的阵列中。该阵列的大小依据最大化视窗的大小和等宽的系统字体。如果使用者在程式执行时调整了视讯显示的大小(在这种情况下KEYVIEW1接收WM_DISPLAYCHANGE讯息),将重新分配此阵列。KEYVIEW1使用标准C的malloc函式为阵列配置记忆体。
图6-2给出了在键入「Windows」之後KEYVIEW1的萤幕显示。第一列显示了键盘讯息;第二列在键名称的前面显示了按键讯息的虚拟键代码,此代码是经由GetKeyNameText函式取得的;第三列(标注为「Char」)在字元本身的後面显示字元讯息的十六进位字元代码。其余六列显示了lParam讯息参数中六个栏位的状态。

为便於以分行的方式显示此资讯,KEYVIEW1使用了等宽字体。与前一章所讨论的一样,这需要呼叫GetStockObject和SelectObject:
|