C++Builder实现鼠标钩子

来源:互联网 发布:子域名查询工具3.0 编辑:程序博客网 时间:2024/05/16 00:28

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

0 0
原创粉丝点击