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();//导入函数的声明
//vs2008以后可以不这样来加载和导入函数的声明。
//在窗体类顶部加上
//typedef HHOOK TSetHook(void); //定义变量别名
//TSetHook *SetHook;//定义函数指针
//在消息处理程序中加上
//HMODULE hdd=LoadLibrary(L"mydll.dll");//加载链接库
//SetHook=(TSetHook*)::GetProcAddress(hdd,"SetHook");//获取函数地址
void CrxjhcDlg::OnBnClickedButtonsethook() { // TODO: 在此添加控件通知处理程序代码 SetHook(); }

 

 

 

posted @ 2015-03-09 11:15  菜鸡能上树  阅读(952)  评论(0编辑  收藏  举报