#define _CRT_SECURE_NO_WARNINGS #define _CRT_NON_CONFORMING_SWPRINTFS #include<Windows.h> #include<tchar.h> LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow ) { TCHAR szAppName[] = TEXT("KeyView1"); HWND hwnd; MSG msg; WNDCLASSEX wndClass; wndClass.cbSize = sizeof(WNDCLASSEX); wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndClass.hCursor = LoadCursor(NULL,IDC_ARROW); wndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION); wndClass.hIconSm = LoadIcon(NULL,IDI_APPLICATION); wndClass.hInstance = hInstance; wndClass.lpfnWndProc = WindowProc; wndClass.lpszClassName = szAppName; wndClass.lpszMenuName = NULL; wndClass.style = CS_VREDRAW|CS_HREDRAW|CS_OWNDC; if(!RegisterClassEx(&wndClass)) { MessageBox(NULL,TEXT("it requires Windows NT!"),TEXT("TIPS"),0); return -1; } hwnd = CreateWindow( szAppName,TEXT("KeyView1 Window"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL ); ShowWindow(hwnd,iCmdShow); UpdateWindow(hwnd); while(GetMessage(&msg,0,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { static TCHAR szHeading[] = TEXT("Message Key Char Repeat Scan Ext Alt Prev Tran"); static TCHAR szUndLine[] = TEXT("_______ ___ ____ ______ ____ ___ ___ ____ ____"); static TCHAR szMessage[][20] = { TEXT("WM_KEYDOWN"),TEXT("WM_KEYUP"), TEXT("WM_CHAR"),TEXT("WM_DEADCHAR"), TEXT("WM_SYSKEYDOWN"),TEXT("WM_SYSKEYUP"), TEXT("WM_SYSCHAR"),TEXT("WM_SYSDEADCHAR") }; static TCHAR szYesNo[][5] = { TEXT("NO"),TEXT("YES") }; static TCHAR szDownUp[][6] = { TEXT("UP"),TEXT("DOWN") }; static TCHAR szFormat[] = TEXT("%11s %2d %8s %6X %c %6d %4d %3s %3s %4s %4s"); static int cxClient,cyClient,cxChar,cyChar,cyLines; static PMSG pmsg; TCHAR szBuffer[100],szKeyName[32]; HDC hdc; PAINTSTRUCT ps; TEXTMETRIC tm; RECT rect; int iType; switch(message) { case WM_CREATE: case WM_DISPLAYCHANGE: GetClientRect(hwnd,&rect); hdc = GetDC(hwnd); SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT)); SetBkMode(hdc,TRANSPARENT); GetTextMetrics(hdc,&tm); cxChar = tm.tmAveCharWidth; cyChar = tm.tmHeight+tm.tmExternalLeading; ReleaseDC(hwnd,hdc); cxClient = rect.right; cyClient = rect.bottom; case WM_SIZE: if(message == WM_SIZE) { cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); } cyLines = cyClient / cyChar; if(pmsg) free(pmsg); pmsg = (PMSG)malloc(sizeof(MSG)*cyLines); if(!pmsg) { MessageBox(NULL,TEXT(" Fail to malloc!"),TEXT("TIPS"),0); return -1; } memset(pmsg,0,sizeof(MSG)*cyLines); break; case WM_KEYDOWN: case WM_KEYUP: case WM_CHAR: case WM_DEADCHAR: case WM_SYSKEYDOWN: case WM_SYSKEYUP: case WM_SYSCHAR: case WM_SYSDEADCHAR: for(int i = cyLines - 2;i >= 0 ;i--) { pmsg[i+1] = pmsg[i]; } pmsg[0].lParam = lParam; pmsg[0].message = message; pmsg[0].wParam = wParam; GetClientRect(hwnd,&rect); rect.top = cyChar; ScrollWindow(hwnd,0,cyChar,&rect,&rect); break; case WM_PAINT: hdc = BeginPaint(hwnd,&ps); TextOut(hdc,0,0,szHeading,_tcslen(szHeading)); TextOut(hdc,0,0,szUndLine,_tcslen(szUndLine)); for(int i = 0;i<cyLines;i++) { if(pmsg[i].wParam == 0)break; iType = pmsg[i].message == WM_CHAR||pmsg[i].message == WM_DEADCHAR||pmsg[i].message == WM_SYSCHAR||pmsg[i].message == WM_SYSDEADCHAR; GetKeyNameText(pmsg[i].lParam,szKeyName,sizeof(szKeyName)/sizeof(TCHAR)); TextOut( hdc,0,(i+1)*cyChar, szBuffer, _stprintf(szBuffer,szFormat, szMessage[pmsg[i].message - WM_KEYFIRST],pmsg[i].wParam,iType?TEXT(" "):szKeyName,pmsg[i].wParam,iType?pmsg[i].wParam:TEXT(' '),LOWORD(pmsg[i].lParam),HIWORD(pmsg[i].lParam)&0xFF,szYesNo[pmsg[i].lParam&0x00800000],szYesNo[pmsg[i].lParam&0x20000000],szDownUp[pmsg[i].lParam&0x40000000],szDownUp[pmsg[i].lParam&0x80000000]) ); } EndPaint(hwnd,&ps); break; case WM_DESTROY: if(pmsg) free(pmsg); PostQuitMessage(0); break; } return DefWindowProc(hwnd,message,wParam,lParam); }
代码是自己写的,和书上的不大一样,但大同小异。