// 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);
};