底层DLL屏蔽任意键

    技术2022-05-11  78

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

     


    最新回复(0)