C++Builder实现鼠标钩子

c++builder 专栏收录该内容
3 篇文章 0 订阅

DLL中的代码:

#define WM_KEY_HOOK    WM_USER+200  //自定义消息



extern "C" {
  __declspec(dllexport)  BOOL APIENTRY StartHook(); //安装键盘钩子
  __declspec(dllexport)  BOOL APIENTRY EndHook();   //删除键盘钩子
  LRESULT WINAPI KeyProc(int nCode,WPARAM wparam,LPARAM lparam);
}


HHOOK     hHook=NULL;           //鼠标钩子函数句柄
HINSTANCE hInstance=NULL;       //DLL实例句柄
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        hInstance=hinst;
        return 1;
}
//---------------------------------------------------------------------------
__declspec(dllexport)  BOOL APIENTRY StartHook()
{


        hHook=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)KeyProc,hInstance,0);
        return (bool)hHook;
}


__declspec(dllexport)  BOOL APIENTRY EndHook()
{
        if(hHook&&UnhookWindowsHookEx(hHook))
           hHook=NULL;
        return (bool)hHook;
}


__declspec(dllexport) LRESULT WINAPI KeyProc(int nCode,WPARAM wparam,LPARAM lparam) {
        HWND hwnd;
        hwnd=FindWindow(NULL,"键盘钩子测试");


        KBDLLHOOKSTRUCT *keyMSG=(KBDLLHOOKSTRUCT *)lparam;
        if(nCode==HC_ACTION && (WM_KEYDOWN == wparam || wparam == WM_SYSKEYDOWN))
        {


                DWORD dwMsg = 1;
                dwMsg += keyMSG->scanCode << 16;
                dwMsg += keyMSG->flags << 24;


                SendMessage(hwnd,WM_KEY_HOOK,(WPARAM)(dwMsg), lparam);
        }
        return CallNextHookEx(hHook,nCode,wparam,lparam); //继续传递鼠标消息

}


测试程序中的代码:

头文件中:自定义消息类型和消息映射函数


#define WM_KEY_HOOK    WM_USER+200  //自定义消息


void __fastcall OnKeyHook(TMessage &Msg);

BEGIN_MESSAGE_MAP

        MESSAGE_HANDLER(WM_KEY_HOOK, TMessage, OnKeyHook);

END_MESSAGE_MAP(TForm);

源码中:

首先,声明需要调用外部方法,用于安装和卸载钩子(按钮事件触发):

extern "C" {
 BOOL APIENTRY StartHook(); //安装鼠标钩子
 BOOL APIENTRY EndHook();   //删除钩子
}

再实现OnKeyHook方法:

void __fastcall TForm1::OnKeyHook(TMessage &Msg)
{
        AnsiString  str;


        //获取最前端窗口的句柄
        HWND hwnd = GetForegroundWindow();
        char windowTitle[50] = {0};
        GetWindowText(hwnd,windowTitle,sizeof(windowTitle));
        AnsiString result = AnsiString(windowTitle[0]);


        str += windowTitle;
        str += ":按下按键[" ;
        char key[20]={0};
        GetKeyNameText(Msg.WParam, key, 20);//根据鼠标信息获取按键名
        str += key;
        
        str += "]";
        Memo1->Lines->Add(str);
}


源码云盘地址:http://pan.baidu.com/s/1bn2Yi67

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论
请先登录 后发表评论~
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏作者

守望者OR

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

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

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

打赏作者

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

抵扣说明:

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

余额充值