给DLL初学者——全程键盘钩子的一种简单实现

随着中间件技术的发展, DLL越来越为程序员所关注,因为使用DLL具有一系列优点,所以程序设计人员可能更多的在自己的软件中采用这种技术。

下面我就把以前做过的一个简单的全程键盘钩子分析一下。

钩子[以下简称Hook]是应用程序在Microsoft Windows 消息处理过程中设置的用来监控消息流并且处理系统中尚未到达目的窗口的某一类型消息过程的机制。如果Hook过程在应用程序中实现,若应用程序不是当前窗口时,该Hook就不起作用;如果HookDLL中实现,程序在运行中动态调用它,它能实时对系统进行监控。根据需要,我们采用的是在DLL中实现Hook的方式[关于HOOK更详细的资料请查阅资料]

VC中新建一Win32 Dynamic-Link Library 工程,工程名为KBLockAppWizard会生成相关文件,编译生成的KBLock.cpp

#include "stdafx.h"

#include "KBLock.h"

 

 

HHOOK hhkHook=NULL;                            //定义钩子句柄

HINSTANCE hInstance=NULL;                  //程序实例

 

//下面的DLLMain相当于Win32程序中的WinMain函数,是入口点

BOOL APIENTRY DllMain( HANDLE hModule,

                       DWORD  ul_reason_for_call,

                       LPVOID lpReserved

                                    )

{

    switch (ul_reason_for_call)

       {

              case DLL_PROCESS_ATTACH:

              case DLL_THREAD_ATTACH:

              case DLL_THREAD_DETACH:

              case DLL_PROCESS_DETACH:

                     break;

    }

       hInstance=(HINSTANCE)hModule;          //得到DLL实例

    return TRUE;

}

 

 

//这是处理键盘消息的主要函数,在其中进行禁止操作

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

{

       if (nCode < 0)

       {

              return CallNextHookEx(hhkHook,nCode,wParam,lParam);

       }

       if (nCode != HC_ACTION)

       {

              return CallNextHookEx(hhkHook,nCode,wParam,lParam);

       }

 

//给出提示:键盘已经被锁定,要进行判断,看是否已有提示窗口,否则会弹个没完

       if (!::FindWindow(0, "KeyBoard Locked"))

       {

              ::MessageBox(0,"键盘已经锁定!!!","KeyBoard Locked",MB_OK);

       }

    return 1;   //没有return CallNextHookEx(hhkHook,nCode,wParam,lParam)则不会把消息//传递下去,所以我们的键盘就不起作用了

}

// This is an example of an exported variable

//导出函数:启动键盘锁定

BOOL EnableKeyboardCapture()

{

       if(!(hhkHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,hInstance,0)))

              return FALSE;

       return TRUE;

}

//导出函数:解除键盘锁定

BOOL DisableKeyboardCapture()

 {

        return UnhookWindowsHookEx(hhkHook);

 }

 

 

上面就是DLL中最重要的代码,当然要使DLL能正常工作还要编辑KBLock.h文件:

__declspec(dllexport) BOOL EnableKeyboardCapture();       //加载钩子

__declspec(dllexport) BOOL DisableKeyboardCapture();       //卸载钩子

再编辑KBLock.def

; KBLock.def : Declares the module parameters for the DLL.

 

LIBRARY      "KBLock"

DESCRIPTION  'KBLock Windows Dynamic Link Library'

 

EXPORTS

    ; Explicit exports can go here

 

 EnableKeyboardCapture @1

 DisableKeyboardCapture @2

 

这样我们用Depends.exe查看这个DLL时,就会发现这两个导出函数了。

 

DLL方面的工作已经完成,这样我们就可以在程序中调用它了。

虽然DLL是由VC开发的,但调用它的前台程序可以用任何其它支持DLL调用的语言如:VBVCDELPHIWin32asm实现,下面还是以VC为例,实现DLL的调用。

建一基于Dialog的工程,在其中加入两个按钮:“Lock KeyBoard”“UnLock

CexeDlg类中加入一个成员函数:

/*sign = TRUE 锁定  sign = FALSE解锁*/

BOOL CExeDlg::KBLock(BOOL sign)

{

       hDLL=::LoadLibrary((LPCTSTR)"KBLock");       //加载DLL

       if (hDLL!=NULL)

       {loadhook=(LOADHOOK)::GetProcAddress (hDLL,"EnableKeyboardCapture");

       unloadhook=(UNLOADHOOK)::GetProcAddress (hDLL,"DisableKeyboardCapture");

      

       if(loadhook==NULL||unloadhook==NULL)

       {::MessageBox(0,"对不起,本功能不能使用!!!","Somthing Wrong",MB_OK);

       return 0;

       }

       if(sign)

              loadhook();

       else

       {

              unloadhook();

              ::FreeLibrary(hDLL);

       }

       return 1;

       }

       ::MessageBox(0,"动态库加载失败!!!","Somthing Wrong",MB_OK);

       return 0;

}

 

其中用到了事先定义好的全局变量:

typedef BOOL (CALLBACK *LOADHOOK)();

typedef BOOL (CALLBACK *UNLOADHOOK)();

HINSTANCE hDLL=NULL;

LOADHOOK loadhook;

UNLOADHOOK unloadhook;

 

这样我们在两个按钮中分别加入KBLock(TRUE); KBLock(FALSE);即可。

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
又一个delphi键盘钩子用法及代码,可以截获几乎所有键值,例如:shift ?,ctrl ?,alt ?,F1~F12,shift或者ctrl或者alt F1~F12,单独的 shift、ctrl、alt 键值,特殊键ins、del、caps lock、num lock、小键盘数字 等等,你只要稍作修改,也可以截获 ctrl alt ?等键值,没有截获不到的键值,本程序不使用dll方式,使用常规方式,方便你编译调试修改,支持xp、vista、win7,是最强悍的键盘钩子控件, 在delphi7下通过。   myshiftchar:string;//返回shift状态 例如 ctrl   mypresschar:string;//返回整个键值 例如 ctrl g   dulictrl:string;//返回 ctrl 和 alt 单独状态, =ctrl or =alt   安装方法:   本控件的核心源代码在 unit2   首先 创建调用主窗体,假定是form1,在form1上放一个 memo控件(必须),然后创建一个新单元 如unit2,把我的unit2 单元的源代码全部复制过去,做以下修改,首先确保form1使用 新单元 如unit2,并且unit2也使用form1。   在新单元unit2中 ,找到 函数 function KeyBHkHandle 过程,在其中找到以下两条语句:    // 在这里根据自己的情况修改    form1.Memo1.Lines.Add(mypresschar);   // 在这里根据自己的情况修改    if mypresschar'' then form1.Memo1.Lines.Add(mypresschar);   如果你的调用主窗体就叫form1,则不用修改,否则把这两条语句的form1修改为你的调用主窗体的名字。   在 memo编辑框的onChange事件中编写自己的 键盘消息接受主控制过程,其中 字符串mypresschar 返回总键值,它跟memo编辑框中显示值是一样的 ,例如 g、shift g、ctrl 2、F9、alt F9、 等等,其中 字符串shiftstr 返回 控制键 shift ctrl alt 的状态,例如按下ctrl,则 shiftstr=‘ctrl’ ,否则=''。   最后不要忘记在程序退出时卸载键盘钩子
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

mahongxi

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值