windows下c语言钩子,用c语言编写全局键盘钩子

#include static HHOOK hkb=NULL;

static HINSTANCE hins;

LRESULT RetVal;

// 使用__declspec(dllexport)声明导出函数

__declspec(dllexport) LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam);

__declspec(dllexport) BOOL InstallHook();

__declspec(dllexport) BOOL UnstallHook();

__declspec(dllexport) DWORD SaveDataToFile(

LPSTR szFilePath,

LPVOID lpData,

DWORD dwDataSize);

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

* DllMain

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

BOOL WINAPI DllMain(

HINSTANCE hinstDLL, // DLL模块的句柄

DWORD fdwReason, // 调用的情况

LPVOID lpReserved ) // reserved

{

// 在不同的情况下都会调用DllMain函数,分别处理

switch( fdwReason )

{

// 加载Dll

case DLL_PROCESS_ATTACH:

{

hins = hinstDLL;

printf("The dll loaded!\n");

break;

}

// 新建线程

case DLL_THREAD_ATTACH:

break;

// 线程退出

case DLL_THREAD_DETACH:

break;

// 释放Dll

case DLL_PROCESS_DETACH:

hins = NULL;

printf("The dll released!\n");

break;

}

return TRUE;

}

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)

{

if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))

{

switch(wParam)

{

// ESC F1~F12

case VK_ESCAPE:

MessageBox(NULL,"SPACE",NULL,NULL);

SaveDataToFile("C:\\Users\\zqc\\Desktop\\show.txt","SPACE",lstrlen("SPACE"));

break;

case VK_F1:

MessageBox(NULL,"F1",NULL,NULL);

SaveDataToFile("C:\\Users\\zqc\\Desktop\\show.txt","F1",lstrlen("F1"));

// 0~9

case '1':

SaveDataToFile("C:\\Users\\zqc\\Desktop\\show.txt","1",lstrlen("1"));

break;

default:

RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );

return RetVal;

}

}

}

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

*install a hook procedure to monitor the system for all

*threads in the same desktop as the calling thread

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

BOOL InstallHook()

{

hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hins,0);

if(hkb != NULL)

{

printf("Setwindowshook done!\n");

}

return TRUE;

}

BOOL UnstallHook()

{

BOOL unhooked = UnhookWindowsHookEx(hkb);

return unhooked;

}

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

* SaveDataToFile

* 功能将数据存储到文件末尾

* 参数LPSTR szFilePath文件路径

*LPVOID lpData需存储的数据

*DWORD dwDataSize数据大小(字节)

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

DWORD SaveDataToFile(

LPSTR szFilePath,

LPVOID lpData,

DWORD dwDataSize)

{

//文件句柄

HANDLE hFileWrite;

//成功写入的数据大小

DWORD dwWritedDateSize;

//打开已经存在的文件,读取内容。

hFileWrite = CreateFile(szFilePath,// 要打开的文件名

GENERIC_WRITE,// 以写方式打开

0,// 可共享读

NULL,// 默认安全设置

OPEN_ALWAYS,// 打开已经存在的文件,没用则创建

FILE_ATTRIBUTE_NORMAL,// 常规文件属性

NULL);// 无模板

//判断是否打开成功

if(hFileWrite==INVALID_HANDLE_VALUE)

{

printf("打开文件失败:%d\n",GetLastError());

}

//设置文件指针到文件尾

SetFilePointer(hFileWrite,0,0,FILE_END);

//将数据写入文件

if(!WriteFile(hFileWrite,lpData,dwDataSize,&dwWritedDateSize,NULL))

{

printf("写文件失败:%d\n",GetLastError());

}

else

{

printf("写文件成功,写入%d字节。\n",dwWritedDateSize);

}

CloseHandle(hFileWrite);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值