// keyboard.cpp : Defines the entry point for the DLL application.//
#include "stdafx.h"#include "keyboard.h"#include "stdlib.h"#include "winuser.h" //定义了PKBDLLHOOKSTRUCT
#pragma data_seg (".mydata")LPDWORD keys=NULL; //数组的指针int len=0; //个数BOOL diskeyboard=FALSE; //是否屏蔽整个键盘HHOOK hook=NULL; //钩子句柄HINSTANCE hinstance; //模块句柄PKBDLLHOOKSTRUCT pstruct;#pragma data_seg ()#pragma comment(linker, "/SECTION:.mydata,RWS") // 告诉链接器:建立数据共享段
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ hinstance=(HINSTANCE)hModule; switch(ul_reason_for_call) { case DLL_PROCESS_DETACH: if (hook!=NULL) { delete keys; UnhookWindowsHookEx(hook); } } return TRUE;}
LRESULT CALLBACK keyproc(int ncode,WPARAM wparam,LPARAM lparam){ if (ncode==HC_ACTION) { if (diskeyboard==TRUE) { return TRUE; } pstruct=(KBDLLHOOKSTRUCT*)lparam; for (int i=0;i<len;i++) { if (pstruct->vkCode==keys[i]) { return TRUE; } } } return CallNextHookEx(hook,ncode,wparam,lparam);}
BOOL diskeys(LPDWORD lkeys,int llen,BOOL ldisblekeyboard/* =FALSE */){ //DWORD kkeys[]={'J',VK_LWIN,VK_F4,VK_CONTROL};调用方法 if (hook!=NULL) { return FALSE; } keys=(LPDWORD)malloc(sizeof(DWORD)*llen); for (int i=0;i<llen;i++) { keys[i]=*lkeys++; } len=llen; diskeyboard=ldisblekeyboard; hook=SetWindowsHookEx(WH_KEYBOARD_LL,keyproc,hinstance,NULL); return TRUE;}BOOL stophook(){ if (hook!=NULL) { UnhookWindowsHookEx(hook); } return TRUE;}
StdAfx.h中添加
#define _WIN32_WINNT 0X0400 //win2000或以后版本
keyboard.h中负责输出函数
extern "C"{__declspec(dllexport) BOOL stophook();__declspec(dllexport) BOOL diskeys(LPDWORD lkeys,int llen,BOOL ldisblekeyboard=FALSE);};