2.添加键盘钩子。向进程中注入dll

学习笔记

1.首先要建立mfc的动态链接库。在def文件中放入要导出的函数名。

2.添加函数如下

//安装钩子
//HHOOK SetWindowsHookEx(
//    int idHook,//钩子的类型WH_KEYBOARD键盘钩子
//    HOOKPROC lpfn,//钩子的回调函数,钩子类型不同回调函数不同
//    HINSTANCE hwnd,//dll动态链接库的句柄
//    DWORD dwthreadid//游戏主进程的id 是GetWindowThreadProcessId的返回值
//    )
//键盘钩子对应的回调函数
LRESULT CALLBACK GameProc(
int code,
WPARAM wParam,//按键代码,例如f12=VK_F12
LPARAM lParam//按键相关的信息。具体百度
)
{
    //用到mfc中的api就得加上这句宏!!!!
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    //还可以添加按键被按下之后执行的逻辑
    if((wParam==VK_F12)&&(lParam&(1<<31)==0))//取出lparam的第31位0则是被按下
    {
        AfxMessageBox(L"按下F12");
    }
    return CallNextHookEx(0,code,wParam,lParam);
}
#define gamename L"YB_OnlineClient"//宏定义窗口名称
void SetHook()
{
    //用到mfc中的api就得加上这句宏!!!!
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    //获取窗口句柄
    HWND gameh=::FindWindowW(NULL,gamename);
    //获取线程id
    DWORD gameid=GetWindowThreadProcessId(gameh,NULL);
    //线程钩子第三个参数不能为0,第四个参数为0 则是全局钩子。
    //::GetModuleHandleA("mydll.dll")获取动态链接库的句柄
    ::SetWindowsHookExW(WH_KEYBOARD,&GameProc,::GetModuleHandleA("mydll.dll"),gameid);
}
3.新建窗口程序添加钩子。
3.1把动态链接库生成的dll和lib文件复制到窗口程序的release文件下或者根目录下或者debug下
3.2添加程序如下
#pragma comment(lib,"mydll.lib")//引入dll的链接库
_declspec(dllimport) void SetHook();//导入函数的声明

void CrxjhcDlg::OnBnClickedButtonsethook()
{
    // TODO: 在此添加控件通知处理程序代码
     SetHook();
}

 

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。