首页
社区
课程
招聘
键盘记录程序
发表于: 2005-10-26 14:40 6110

键盘记录程序

2005-10-26 14:40
6110
#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(
  HINSTANCE hInstance,  // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,      // pointer to command line
  int nCmdShow          // show state of window
)

{
                WNDCLASS wndclass;
                TCHAR szAppName[]=TEXT("Keyview");
                HWND hwnd;
                MSG msg;

                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.hInstance=hInstance;
                wndclass.lpfnWndProc=WndProc;
                wndclass.lpszClassName=szAppName;
                wndclass.lpszMenuName=NULL;
                wndclass.style=CS_HREDRAW | CS_VREDRAW;

                if(!RegisterClass(&wndclass))
                {
                                MessageBox(NULL,TEXT("This need NT"),szAppName,0);
                                return 0;
                }

                hwnd=CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,
                                                        CW_USEDEFAULT,CW_USEDEFAULT,
                                                        CW_USEDEFAULT,CW_USEDEFAULT,NULL,
                                                        NULL,hInstance,NULL);
                ShowWindow(hwnd,SW_SHOWNORMAL);
                UpdateWindow(hwnd);
       
                while(GetMessage(&msg,NULL,0,0))
                        {
                                TranslateMessage(&msg);
                                DispatchMessage(&msg);
                        }
                return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message, WPARAM wParam,LPARAM lParam)
{
        static int cxClient,cyClient,cyClientMax,cxChar,cyChar;
        static int cLines,cLinesMax;
        static DWORD dwCharSet=DEFAULT_CHARSET;
        static TCHAR szTop[]=TEXT("Message           Key        Char     ")
                                                TEXT("Repeat   Scan   Ext   Alt   Prev   Tran");
        static TCHAR szUnd[]=TEXT("_________       _____      ______     ")
                                                  TEXT("______   ____   ___   ___   ____   ____");
        static TCHAR *szFormat[]={TEXT("%-13s%8d%-11s%c%10u%7d%7s%6s%7s%7s"),
                                                                TEXT("%-14s 0x%04X%10s%c%11u%7d%7s%6s%7s%7s")};
        TCHAR  *szMessage[]={TEXT("WM_KEYDOWN"),TEXT("WM_KEYUP"),TEXT("WM_CHAR "),TEXT("WM_DEADCHAR"),
                                                TEXT("WM_SYSKEYDOWN"),TEXT("WM_SYSKEYUP"),
                                                TEXT("WM_SYSCHAR"),TEXT("WM_SYSDEADCHAR")};
        int i,iType;
        static PMSG pmsg;
        TCHAR *szYes=TEXT("YES");
        TCHAR *szNo=TEXT("No");
        TCHAR *szUp=TEXT("UP");
        TCHAR *szDown=TEXT("DOWN");
        TCHAR szBuffer[128],szKeyName[20];
        HDC hdc;
        HFONT hFont;
        TEXTMETRIC tm;
        PAINTSTRUCT ps;
        static RECT rect;
       

        switch (message)
        {       
               

                case WM_CREATE:
                        //PlaySound(TEXT("Windows XP 启动.wav"),NULL,SND_ASYNC |SND_FILENAME);

                case WM_INPUTLANGCHANGE:
                        dwCharSet=wParam;
                        InvalidateRect (hwnd, NULL, TRUE) ;
                case WM_DISPLAYCHANGE:
                        hdc=GetDC(hwnd);
                        hFont=CreateFont(0,0,0,0,0,
                                                0,0,0,dwCharSet,0,0,0,FIXED_PITCH,0);
                        SelectObject(hdc,hFont);
                        GetTextMetrics(hdc,&tm);
                        cxChar=tm.tmAveCharWidth;
                        cyChar=tm.tmHeight+tm.tmExternalLeading;
                        DeleteObject(hFont);
                        ReleaseDC(hwnd,hdc);
                        cyClientMax=GetSystemMetrics(SM_CYMAXIMIZED);
                        cLinesMax=cyClientMax/cyChar;
                        if(pmsg)
                                free(pmsg);
                        pmsg = (PMSG)malloc (cLinesMax * sizeof (MSG)) ;
                        cLines=0;
                        return 0;
                       
                case WM_SIZE:
                        cxClient=LOWORD(lParam);
                        cyClient=HIWORD(lParam);
                        rect.left=0;
                        rect.top=cyChar;
                        rect.right=cxClient;
                        rect.bottom=cyChar*(cyClient/cyChar);

                        return 0;
               
                case WM_KEYDOWN:
                case WM_KEYUP:
                case WM_SYSKEYDOWN:
                case WM_SYSKEYUP:
                case WM_DEADCHAR:
                case WM_SYSCHAR:
                case WM_SYSDEADCHAR:
                case WM_CHAR:
                        for(i=cLinesMax-1;i>0;i--)
                                pmsg[i]=pmsg[i-1];
                        pmsg[0].hwnd=hwnd;
                        pmsg[0].message=message;
                        pmsg[0].wParam=wParam;
                        pmsg[0].lParam=lParam;
                        cLines=min(cLines+1,cLinesMax);
                        ScrollWindow(hwnd,0,-cyChar,&rect,&rect);
                        UpdateWindow(hwnd);                       
                        return 0;
                case WM_PAINT:
                        hdc=BeginPaint(hwnd,&ps);
                        hFont=CreateFont(0,0,0,0,0,
                                                0,0,0,dwCharSet,0,0,0,FIXED_PITCH,0);
                        SelectObject(hdc,hFont);
                        TextOut(hdc,0,0,szTop,lstrlen(szTop));
                        SetBkMode(hdc,TRANSPARENT);
                        TextOut(hdc,0,0,szUnd,lstrlen(szUnd));
                        for(i=0;i<min(cLines,cyClient/cyChar-1);i++)
                        {
                                iType=pmsg[i].message==WM_CHAR||
                                          pmsg[i].message==WM_SYSCHAR||
                                          pmsg[i].message==WM_DEADCHAR||
                                          pmsg[i].message==WM_SYSDEADCHAR;
                                GetKeyNameText(pmsg[i].lParam,szKeyName,20);

                                TextOut(hdc,0,cyChar*(cyClient/cyChar-1-i),szBuffer,
                                            wsprintf(szBuffer,szFormat[iType],szMessage[pmsg[i].message-WM_KEYFIRST],
                                                                 pmsg[i].wParam,
                                                                 (PTSTR)(iType?TEXT(" "):szKeyName),
                                                                 (TCHAR)(iType?pmsg[i].wParam:TEXT(' ')),
                                                                 LOWORD(pmsg[i].lParam),
                                                                 HIWORD(pmsg[i].lParam)&0XFF,
                                                                 0X00010000 & lParam?szYes:szNo,
                                                                 0X20000000 & lParam?szYes:szNo,
                                                                 0X40000000 & lParam?szDown:szUp,
                                                                 0X80000000 & lParam?szUp:szDown
                                                                 ));
                                                                 
                        }
                       
                        EndPaint(hwnd,&ps);
                        DeleteObject(hFont);
                        return 0;

                case WM_DESTROY:
                        PostQuitMessage(0);
                        return 0;

                default:
                        return DefWindowProc(hwnd,message,wParam,lParam);

        }

}

编译使用_MBCS,希腊文和俄文可以正确显示,但是德文的重音不可以!!!!
我用的是中文版win xp,请问一下字母表的问题!!!
德语键盘的字母表填充方式不是与ansi一样吗,怎么不能显示呢????
字符的wParam值是正确的,就是不能显示。大家讲讲怎么回事,或是我应该看什么书????
我郁闷了两天了,网上也找不到资料。。
各位打下帮帮忙吧!!!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
指导一下看什么书也好啊,windows程序设计就不用说了,因为我就看的这本书!!
相信斑竹也看过的,有没有这样的问题呢????
解答一下吧,谢谢了!!!
2005-10-26 18:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个是我正在学的,我会加把劲
2005-10-29 06:52
0
游客
登录 | 注册 方可回帖
返回
//