ffffff

来源:互联网 发布:淘宝宝贝规格图片尺寸 编辑:程序博客网 时间:2024/06/04 19:50

本软件分为两个部分,一部分是DLL模块,里面利用Hook技术完成键盘监控和写入文件的功能;另一部分是界面部分,调用DLL启动和停止客户操作记录功能。

1步:创建MFC DLL项目

2步:创建TestHook.h文件

3步:加入全局共享数据变量

4步:保存DLL实例句柄

5步:类CKeyboradHook的成员函数

6步:创建钩子可执行程序

1步:创建MFC DLL项目

创建一个名为HookTestprojectproject的类型为选择MFC AppWizard(DLL),DLL类型为MFC Extension DLL(using shared MFC DLL)

注意:选择File->New菜单项,在弹出对话框的左边的列表框中选择MFC AppWizard(DLL).

project name文本框中输入项目名称,HookTestlocation中输入项目的存盘路径;选中Create new workspace;在platForms列表中选择Win32选项。

单击OK按钮继续下一步,在弹出的对话框中设置DLL类型为MFC Extension DLLusing shared MFC DLL.

IDE中,选择FileView选项卡,在其中就会发现其中有HookTest.cpp文件,却没有HookTest.h文件,这是因为visual C++6.0中没有现成的钩子类,所以要自己动手创建TestHook.h文件,在其中建立钩子类。

2步:创建TestHook.h文件

选择File菜单,再选择New菜单项,将弹出New对话框。选择files选项卡,并且选择其中的C/C++ Header File.

选中add to project,并且在对应的下拉列表中选择项目名称HookTest;在location文本框中输入项目的存盘路径,或单击右边的按钮选择相应的路径;在file对应的文本框中输入文件名HookTest.h;单击OK按钮,在IDE中自动打开Hooktest.h文件供编辑代码用;

TestHook.h文件:

#if _MSC_VER>1000

#pragma once

#endif //_MSC_VER>1000

 

class AFX_EXT_CLASS CHookTest:public CObject

{

public:

    CHookTest();

    ~CHookTest();

    BOOL StartHook();//StartHook()函数实现安装钩子

    BOOL StopHook();//StopHook()函数实现卸载钩子

};

3步:加入全局共享数据变量

HookTest.cpp文件中添加:

//存储各个键赌赢的字符

CString cskey[TOTAL_KEYS]=

{

    "BACKSPACE",

    "TAB",

    ……

    "F12",

};

//存储各个键对应的键值

int nkey[TOTAL_KEYS]=

{

    0X08, //"BACKSPACE",

    0X09, //"TAB",

    …….

    0x7b,//"F12",

};

#pragma data_seg("mydata")

//安装的键盘钩子子句柄

HHOOK glhTestHook=NULL;

//DLL实例句柄

HINSTANCE glhkInstance=NULL;

#pragma data_seg()

 

4保存DLL实例句柄

DllMain函数中添加如下代码

    if (dwReason == DLL_PROCESS_ATTACH)

    {

       TRACE0("HOOKTEST.DLL Initializing!/n");

       //扩展DLL仅初始化一次

       if (!AfxInitExtensionModule(HookTestDLL, hInstance))

           return 0;

       //DLL加入动态MFC类库中

       new CDynLinkLibrary(HookTestDLL);

       //保存DLL实例句柄

       glhkInstance=hInstance;

    }

    else if (dwReason == DLL_PROCESS_DETACH)

    {

       TRACE0("HOOKTEST.DLL Terminating!/n");

       //终止这个链接库前调用它

       AfxTermExtensionModule(HookTestDLL);

    }

    return 1;   // ok

5步:类CKeyboradHook的成员函数

//KeyboradProc函数

LRESULT WINAPI KeyboradProc(int nCode,WPARAM wParam,LPARAM lParam)

{

    for(int i=0;i<TOTAL_KEYS;i++)

    {

       if(nkey[i]==(int)wParam)

       {

           int nKeyStatus=lParam &0x80000000;

           //根据用户按键播放对应的声音文件

           switch(nKeyStatus)

           case 0://WM_KEYUP

              //case 0x80000000://WM_KEYUP

           {

              char* pszFileName="C://myfile.txt";

              CStdioFile myFile;

              CFileException fileException;

 

           if(myFile.Open(pszFileName,CFile::typeText|CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite),&fileException)

              {

                  myFile.SeekToEnd();

                  //将文件指针移动到文件末尾准备进行追加文本的操作

                  //此处可以编写追加文本的操作

                  myFile.WriteString(cskey[i]);

              }

              else

              {

           TRACE("Can't open file %s,error=%u/n",pszFileName,fileException.m_cause);

              }

           }

       }

    }

    //调用CallNextHookEx函数把钩子信息传递给钩子链的下一个钩子函数

    return CallNextHookEx(glhTestHook,nCode,wParam,lParam);

}

6步:创建钩子可执行程序

//****************************

BOOL CHookTest::StartHook()

{

    glhTestHook=SetWindowsHookEx(WH_KEYBOARD,KeyboradProc,glhkInstance,0);

    if(glhTestHook!=NULL)

       return TRUE;

    return FALSE;

}

//****************************

/*

HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,INSTANCE hMod,DWORD dwThreadId)

idHook:钩子类型,它是和钩子函数类型一一对应的,例如,WH_KEYBOARD表示安装的是键盘钩子,WH_MOUSE表示的是鼠标钩子等。

lpfn:钩子函数的地址

hMod:钩子函数所在的实例的句柄,对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数的DLL句柄

dwThreadId:指定钩子所监视的线程的线程号,对于全局钩子,该参数为NULL.

SetWindowsHookEx返回所安装的钩子句柄。

调用StartHook函数后,所有键盘的消息都会转移到KeyboradProc函数中,通过数组nkey的值与wParam参数相比较,可以知道用户按下的是哪个键,通过对IParam值的判断,可以知道是按下键还是释放键,然后播放键对应的声音文件即可。

 

*/

//****************************

//卸载钩子

BOOL CHookTest::StopHook()

{

    BOOL bResult=FALSE;

    if(glhTestHook)

    {

       bResult=UnhookWindowsHookEx(glhTestHook);

       if(bResult)

       {

           glhTestHook=NULL;

       }

    }

    return bResult;

}

//****************************